diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 00000000000..b712dc09c0a --- /dev/null +++ b/.cursorignore @@ -0,0 +1 @@ +!.env.example \ No newline at end of file diff --git a/.github/workflows/docs-js-libs-update.yml b/.github/workflows/docs-js-libs-update.yml index 8848405c3ea..0ec5bea40cd 100644 --- a/.github/workflows/docs-js-libs-update.yml +++ b/.github/workflows/docs-js-libs-update.yml @@ -4,14 +4,14 @@ on: workflow_dispatch: inputs: version: - description: "Version that was released (e.g., patch, minor, major, or v2.1.0)" + description: 'Version that was released (e.g., patch, minor, major, or v2.1.0)' required: true type: string source: - description: "Source of the documentation update" + description: 'Source of the documentation update' required: false type: string - default: "manual" + default: 'manual' permissions: pull-requests: write @@ -25,8 +25,6 @@ jobs: - uses: actions/checkout@v4 with: ref: master - sparse-checkout: | - apps/docs - uses: pnpm/action-setup@v4 name: Install pnpm @@ -36,8 +34,8 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version-file: ".nvmrc" - cache: "pnpm" + node-version-file: '.nvmrc' + cache: 'pnpm' - name: Install deps run: pnpm i @@ -50,12 +48,18 @@ jobs: echo "Version: ${{ github.event.inputs.version }}" make + - name: Generate new typespec snapshot + working-directory: apps/docs + run: | + echo "Generating new typespec snapshot for review..." + npx vitest run --update ./features/docs/Reference.typeSpec.test.ts + - name: Create pull request uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "docs: update js client libraries (${{ github.event.inputs.version }})" - title: "docs: update js client libraries (${{ github.event.inputs.version }})" + commit-message: 'docs: update js client libraries (${{ github.event.inputs.version }})' + title: 'docs: update js client libraries (${{ github.event.inputs.version }})' body: | Updates JS client libraries documentation following stable release. Ran `make` in apps/docs/spec to regenerate tsdoc files. @@ -66,5 +70,5 @@ jobs: - **Changes:** Regenerated tsdoc files from latest spec files 🤖 Auto-generated from supabase-js-libs stable release. - branch: "gha/update-js-libs-docs-${{ github.run_number }}" - base: "master" + branch: 'gha/update-js-libs-docs-${{ github.run_number }}' + base: 'master' diff --git a/.github/workflows/update-js-libs.yml b/.github/workflows/update-js-libs.yml index 4715581686c..4d8da2a1845 100644 --- a/.github/workflows/update-js-libs.yml +++ b/.github/workflows/update-js-libs.yml @@ -40,19 +40,19 @@ jobs: - name: Update @supabase/*-js packages in pnpm-workspace.yaml run: | # Update @supabase/supabase-js - sed -i "s/'@supabase\/supabase-js': .*/'@supabase\/supabase-js': ^${{ github.event.inputs.version }}/" pnpm-workspace.yaml + sed -i "s/'@supabase\/supabase-js': .*/'@supabase\/supabase-js': ${{ github.event.inputs.version }}/" pnpm-workspace.yaml # Update @supabase/auth-js - sed -i "s/'@supabase\/auth-js': .*/'@supabase\/auth-js': ^${{ github.event.inputs.version }}/" pnpm-workspace.yaml + sed -i "s/'@supabase\/auth-js': .*/'@supabase\/auth-js': ${{ github.event.inputs.version }}/" pnpm-workspace.yaml # Update @supabase/realtime-js - sed -i "s/'@supabase\/realtime-js': .*/'@supabase\/realtime-js': ^${{ github.event.inputs.version }}/" pnpm-workspace.yaml + sed -i "s/'@supabase\/realtime-js': .*/'@supabase\/realtime-js': ${{ github.event.inputs.version }}/" pnpm-workspace.yaml echo "Updated pnpm-workspace.yaml:" cat pnpm-workspace.yaml - name: Install dependencies - run: pnpm i + run: pnpm i --no-frozen-lockfile - name: Create pull request uses: peter-evans/create-pull-request@v6 @@ -66,9 +66,9 @@ jobs: **Source**: ${{ github.event.inputs.source }} **Changes**: - - Updated @supabase/supabase-js to ^${{ github.event.inputs.version }} - - Updated @supabase/auth-js to ^${{ github.event.inputs.version }} - - Updated @supabase/realtime-js to ^${{ github.event.inputs.version }} + - Updated @supabase/supabase-js to ${{ github.event.inputs.version }} + - Updated @supabase/auth-js to ${{ github.event.inputs.version }} + - Updated @supabase/realtime-js to ${{ github.event.inputs.version }} - Refreshed pnpm-lock.yaml This PR was created automatically. diff --git a/apps/cms/package.json b/apps/cms/package.json index d314edd3c20..25169cc2c0b 100644 --- a/apps/cms/package.json +++ b/apps/cms/package.json @@ -53,7 +53,7 @@ "prism-react-renderer": "^2.3.1", "react": "catalog:", "react-dom": "catalog:", - "sharp": "0.32.6", + "sharp": "~0.34.0", "tailwind-merge": "^1.13.2", "tsx": "^4.19.3", "typescript": "catalog:" diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index f07e11812c6..53963fb2883 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -1390,7 +1390,13 @@ export const queues: NavMenuConstant = { { name: 'Getting Started', url: undefined, - items: [{ name: 'Quickstart', url: '/guides/queues/quickstart' }], + items: [ + { name: 'Quickstart', url: '/guides/queues/quickstart' }, + { + name: 'Consuming Messages with Edge Functions', + url: '/guides/queues/consuming-messages-with-edge-functions', + }, + ], }, { name: 'References', @@ -2450,8 +2456,6 @@ export const platform: NavMenuConstant = { name: 'Manage your usage', url: '/guides/platform/manage-your-usage' as `/${string}`, items: [ - { name: 'Usage limits', url: '/guides/platform/usage-limits' as `/${string}` }, - { name: 'Overages', url: '/guides/platform/overages' as `/${string}` }, { name: 'Compute', url: '/guides/platform/manage-your-usage/compute' as `/${string}`, diff --git a/apps/docs/content/guides/database/replication.mdx b/apps/docs/content/guides/database/replication.mdx index 57bd900485d..9b92a2373aa 100644 --- a/apps/docs/content/guides/database/replication.mdx +++ b/apps/docs/content/guides/database/replication.mdx @@ -25,7 +25,7 @@ Postgres comes with built-in support for replication via publications and replic -If you want to set up a read replica, see [Read Replicas](/docs/guides/platform/read-replicas) instead. If you want to sync your data in real time to a client such as a browser or mobile app, see [Realtime](/docs/guides/realtime) instead. +If you want to set up a read replica, see [Read Replicas](/docs/guides/platform/read-replicas) instead. If you want to sync your data in real time to a client such as a browser or mobile app, see [Realtime](/docs/guides/realtime) instead. For configuring replication to an ETL destination, use the [Dashboard](/dashboard/project/_/database/replication). diff --git a/apps/docs/content/guides/getting-started/mcp.mdx b/apps/docs/content/guides/getting-started/mcp.mdx index e3dbd33fba9..737ae7347e7 100644 --- a/apps/docs/content/guides/getting-started/mcp.mdx +++ b/apps/docs/content/guides/getting-started/mcp.mdx @@ -20,14 +20,6 @@ Choose your Supabase platform, project, and MCP client and follow the installati - - -Your MCP client will automatically prompt you to login to Supabase during setup. This will open a browser window where you can login to your Supabase account and grant access to the MCP client. Be sure to choose the organization that contains the project you wish to work with. In the future, we'll offer more fine grain control over these permissions. - -Previously Supabase MCP required you to generate a personal access token (PAT), but this is no longer required. - - - ### Next steps Your AI tool is now connected to your Supabase project or account using remote MCP. Try asking the AI tool to query your database using natural language commands. @@ -63,33 +55,3 @@ We recommend the following best practices to mitigate security risks when using - **Project scoping**: Scope your MCP server to a [specific project](https://github.com/supabase-community/supabase-mcp#project-scoped-mode), limiting access to only that project's resources. This prevents LLMs from accessing data from other projects in your Supabase account. - **Branching**: Use Supabase's [branching feature](/docs/guides/deployment/branching) to create a development branch for your database. This allows you to test changes in a safe environment before merging them to production. - **Feature groups**: The server allows you to enable or disable specific [tool groups](https://github.com/supabase-community/supabase-mcp#feature-groups), so you can control which tools are available to the LLM. This helps reduce the attack surface and limits the actions that LLMs can perform to only those that you need. - -## MCP for local Supabase instances - -The Supabase MCP server connects directly to the cloud platform to access your database. If you are running a local instance of Supabase, you can instead use the [Postgres MCP server](https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres) to connect to your local database. This MCP server runs all queries as read-only transactions. - -### Step 1: Find your database connection string - -To connect to your local Supabase instance, you need to get the connection string for your local database. You can find your connection string by running: - -```shell -supabase status -``` - -or if you are using `npx`: - -```shell -npx supabase status -``` - -This will output a list of details about your local Supabase instance. Copy the `DB URL` field in the output. - -### Step 2: Configure the MCP server - -Configure your client with the following: - -<$Partial path="mcp_postgres_config.mdx" variables={{ "app": "your MCP client" }} /> - -### Next steps - -Your AI tool is now connected to your local Supabase instance using MCP. Try asking the AI tool to query your database using natural language commands. diff --git a/apps/docs/content/guides/platform/backups.mdx b/apps/docs/content/guides/platform/backups.mdx index 72ca5d5c52d..b18781e0ec7 100644 --- a/apps/docs/content/guides/platform/backups.mdx +++ b/apps/docs/content/guides/platform/backups.mdx @@ -21,21 +21,19 @@ Once a project is deleted all associated data will be permanently removed, inclu Database backups can be categorized into two types: **logical** and **physical**. You can learn more about them [here](/blog/postgresql-physical-logical-backups). -As a general rule of thumb, projects will either have logical or physical backups based on plan, database size, and add-ons: + -| Plan | Database Size (0-15GB) | [Database Size (>15GB)](#backup-process-for-large-databases) | [PITR](#point-in-time-recovery) | [Read Replicas](./read-replicas#prerequisites) | -| ---------- | ---------------------- | ------------------------------------------------------------ | ------------------------------- | ---------------------------------------------- | -| Pro | logical | physical | physical | physical | -| Team | logical | physical | physical | physical | -| Enterprise | physical | physical | physical | physical | +To enable physical backups, you have three options: - +- Enable [Point-in-Time Recovery (PITR)](#point-in-time-recovery) +- [Increase your disk size](/docs/guides/platform/database-size) to greater than 15GB +- [Create a read replica](/docs/guides/platform/read-replicas) -Once a project satisfies at least one of the requirements for physical backups then logical backups will no longer be taken. However, your project may revert back to logical backups if add-ons are removed. +Once a project satisfies at least one of the requirements for physical backups then logical backups are no longer made. However, your project may revert back to logical backups if you remove add-ons. -You can confirm your project's backup type by navigating to [Database Backups > Scheduled backups](/dashboard/project/_/database/backups/scheduled) and if you can download a backup then it is logical, otherwise it is physical. +You can confirm your project's backup type by navigating to [**Database Backups > Scheduled backups**](/dashboard/project/_/database/backups/scheduled) and if you can download a backup then it is logical, otherwise it is physical. However, if your project has the Point-in-Time Recovery (PITR) add-on then the backups are physical and you can view them in [Database Backups > Point in time](/dashboard/project/_/database/backups/pitr). diff --git a/apps/docs/content/guides/queues/consuming-messages-with-edge-functions.mdx b/apps/docs/content/guides/queues/consuming-messages-with-edge-functions.mdx new file mode 100644 index 00000000000..8a890895fe6 --- /dev/null +++ b/apps/docs/content/guides/queues/consuming-messages-with-edge-functions.mdx @@ -0,0 +1,109 @@ +--- +title: Consuming Supabase Queue Messages with Edge Functions +subtitle: 'Learn how to consume Supabase Queue messages server-side with a Supabase Edge Function' +--- + +This guide helps you read & process queue messages server-side with a Supabase Edge Function. Read [Queues API Reference](/docs/guides/queues/api) for more details on our API. + +## Concepts + +Supabase Queues is a pull-based Message Queue consisting of three main components: Queues, Messages, and Queue Types. You should already be familiar with the [Queues Quickstart](/docs/guides/queues/quickstart). + +### Consuming messages in an Edge Function + +This is a Supabase Edge Function that reads 5 messages off the queue, processes each of them, and deletes each message when it is done. + +```tsx +import 'jsr:@supabase/functions-js/edge-runtime.d.ts' +import { createClient } from 'npm:@supabase/supabase-js@2' + +const supabaseUrl = 'supabaseURL' +const supabaseKey = 'supabaseKey' + +const supabase = createClient(supabaseUrl, supabaseKey) +const queueName = 'your_queue_name' + +// Type definition for queue messages +interface QueueMessage { + msg_id: bigint + read_ct: number + vt: string + enqueued_at: string + message: any +} + +async function processMessage(message: QueueMessage) { + // + // Do whatever logic you need to with the message content + // + // Delete the message from the queue + const { error: deleteError } = await supabase.schema('pgmq_public').rpc('delete', { + queue_name: queueName, + msg_id: message.msg_id, + }) + + if (deleteError) { + console.error(`Failed to delete message ${message.msg_id}:`, deleteError) + } else { + console.log(`Message ${message.msg_id} deleted from queue`) + } +} + +Deno.serve(async (req) => { + const { data: messages, error } = await supabase.schema('pgmq_public').rpc('read', { + queue_name: queueName, + sleep_seconds: 0, // Don't wait if queue is empty + n: 5, // Read 5 messages off the queue + }) + + if (error) { + console.error(`Error reading from ${queueName} queue:`, error) + return new Response(JSON.stringify({ error: error.message }), { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }) + } + + if (!messages || messages.length === 0) { + console.log('No messages in workflow_messages queue') + return new Response(JSON.stringify({ message: 'No messages in queue' }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }) + } + + console.log(`Found ${messages.length} messages to process`) + + // Process each message that was read off the queue + for (const message of messages) { + try { + await processMessage(message as QueueMessage) + } catch (error) { + console.error(`Error processing message ${message.msg_id}:`, error) + } + } + + // Return immediately while background processing continues + return new Response( + JSON.stringify({ + message: `Processing ${messages.length} messages in background`, + count: messages.length, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + } + ) +}) +``` + +Every time this Edge Function is run it: + +1. Read 5 messages off the queue +2. Call the `processMessage` function +3. At the end of `processMessage`, the message is deleted from the queue +4. If `processMessage` throws an error, the error is logged. In this case, the message is still in the queue, so the next time this Edge Function runs it reads the message again. + +You might find this kind of setup handy to run with [Supabase Cron](/docs/guides/cron). You can set up Cron so that every N number of minutes or seconds, the Edge Function will run and process a number of messages off the queue. + +Similarly, you can invoke the Edge Function on command at any given time with [`supabase.functions.invoke`](/docs/guides/functions/quickstart-dashboard#usage). diff --git a/apps/docs/content/guides/self-hosting/docker.mdx b/apps/docs/content/guides/self-hosting/docker.mdx index 6f4210253b7..a704a2ef93e 100644 --- a/apps/docs/content/guides/self-hosting/docker.mdx +++ b/apps/docs/content/guides/self-hosting/docker.mdx @@ -220,6 +220,7 @@ Update the `./docker/.env` file with your own secrets. In particular, these are - `SITE_URL`: the base URL of your site. - `SMTP_*`: mail server credentials. You can use any SMTP server. - `POOLER_TENANT_ID`: the tenant-id that will be used by Supavisor pooler for your connection string +- `PG_META_CRYPTO_KEY`: encryption key for securing connection strings between Studio and postgres-meta You will need to [restart](#restarting-all-services) the services for the changes to take effect. diff --git a/apps/docs/features/docs/Reference.typeSpec.ts b/apps/docs/features/docs/Reference.typeSpec.ts index 98298bcf2b9..57fd7bff264 100644 --- a/apps/docs/features/docs/Reference.typeSpec.ts +++ b/apps/docs/features/docs/Reference.typeSpec.ts @@ -162,6 +162,7 @@ const KIND_MODULE = 2 const KIND_CLASS = 128 const KIND_INTERFACE = 256 const KIND_CONSTRUCTOR = 512 +const KIND_PROPERTY = 1024 const KIND_METHOD = 2048 const KIND_TYPE_LITERAL = 65536 @@ -303,6 +304,15 @@ function parseModInternal( parseConstructor(node, map, currentPath, res) } else if (node.kind === KIND_METHOD) { return parseMethod(node, map, currentPath, res) + } else if (node.kind === KIND_PROPERTY) { + if (node.type?.type === 'reference') { + const referent = map.get(node.type.target) + if (referent?.variant === 'declaration' && referent?.kind === KIND_INTERFACE) { + const children = referent?.children ?? [] + updatedPath = [...currentPath, node.name] + children.forEach((child: any) => parseModInternal(child, map, updatedPath, res)) + } + } } return case 'property': @@ -439,24 +449,26 @@ function parseSignature( // // with additional properties depending on the type. -function parseType(type: any, map: Map) { +function parseType(type: any, map: Map, typeArguments?: any, debug = false) { switch (type.type) { case 'literal': return type case 'intrinsic': return type case 'reference': - return parseReferenceType(type, map) + return parseReferenceType(type, map, typeArguments, debug) case 'array': - return parseArrayType(type, map) + return parseArrayType(type, map, typeArguments, debug) case 'union': - return parseUnionType(type, map) + return parseUnionType(type, map, typeArguments, debug) case 'reflection': - return parseReflectionType(type, map) + return parseReflectionType(type, map, typeArguments, debug) case 'indexedAccess': - return parseIndexedAccessType(type, map) + return parseIndexedAccessType(type, map, typeArguments, debug) case 'typeOperator': - return parseTypeOperatorType(type, map) + return parseTypeOperatorType(type, map, typeArguments, debug) + case 'conditional': + return parseConditionalType(type, map, typeArguments, debug) default: break } @@ -481,8 +493,13 @@ function parseType(type: any, map: Map) { * parsing to the referenced node, but use the name and comment from the * original type. */ -function delegateParsing(original: any, referenced: any, map: Map) { - const dereferencedType = parseType(referenced, map) +function delegateParsing( + original: any, + referenced: any, + map: Map, + typeArguments?: any +) { + const dereferencedType = parseType(referenced, map, typeArguments) if (dereferencedType) { dereferencedType.name = nameOrAnonymous([original, dereferencedType]) @@ -498,7 +515,44 @@ function delegateParsing(original: any, referenced: any, map: Map) return dereferencedType } -function parseReferenceType(type: any, map: Map) { +function parseConditionalType( + type: any, + map: Map, + typeArguments?: any, + _debug = false +) { + if (type.extendsType?.type === 'intrinsic' && type.extendsType?.name === 'object') { + let properties = [] + + if ( + type.trueType?.type === 'mapped' && + type.trueType?.parameterType?.target?.refersToTypeParameter && + typeArguments?.[0] + ) { + const propertyNames = parseType(typeArguments?.[0], map).properties?.map((p) => p.name) + properties = (propertyNames ?? []) + .map((p: string) => { + if (!type.trueType?.templateType) return undefined + + const mappedType = parseType(type.trueType.templateType, map) + if (mappedType) { + return { + name: p, + type: mappedType, + } + } + }) + .filter(Boolean) + } + + return { + type: 'object', + properties, + } + } +} + +function parseReferenceType(type: any, map: Map, typeArguments?: any, debug = false) { if (type.dereferenced?.type) { return delegateParsing(type, type.dereferenced.type, map) } @@ -507,6 +561,10 @@ function parseReferenceType(type: any, map: Map) { return delegateParsing(type, type.dereferenced, map) } + if (type.refersToTypeParameter === true && typeArguments?.[0]) { + return delegateParsing(type, typeArguments?.[0], map) + } + if ( type.package === 'typescript' && (type.name === 'Record' || type.qualifiedName === 'Record') @@ -537,8 +595,13 @@ function parseReferenceType(type: any, map: Map) { if (referenced) { const maybeType = typeof referenced.type === 'object' && 'type' in referenced.type - ? /* need to go down a level */ delegateParsing(type, referenced.type, map) - : delegateParsing(type, referenced, map) + ? /* need to go down a level */ delegateParsing( + type, + referenced.type, + map, + type.typeArguments + ) + : delegateParsing(type, referenced, map, type.typeArguments) if (maybeType) { return maybeType @@ -580,7 +643,12 @@ function parseReferenceType(type: any, map: Map) { return undefined } -function parseArrayType(type: any, map: Map): ArrayType { +function parseArrayType( + type: any, + map: Map, + _typeArguments?: any, + debug = false +): ArrayType { const elemType = parseType(type.elementType, map) return { @@ -590,9 +658,14 @@ function parseArrayType(type: any, map: Map): ArrayType { } } -function parseUnionType(type: any, map: Map): CustomUnionType { +function parseUnionType( + type: any, + map: Map, + typeArguments?: any, + _debug = false +): CustomUnionType { // Need the Boolean filter because there are nulls in some of the nodes - const subTypes = type.types.filter(Boolean).map((type) => parseType(type, map)) + const subTypes = type.types.filter(Boolean).map((type) => parseType(type, map, typeArguments)) return { type: 'union', @@ -654,17 +727,22 @@ function parsePickType(type: any, map: Map) { return undefined } -function parseReflectionType(type: any, map: Map): TypeDetails | undefined { +function parseReflectionType( + type: any, + map: Map, + typeArguments?: any, + _debug = false +): TypeDetails | undefined { if (!type.declaration) return undefined let res: TypeDetails | undefined switch ((type.declaration.kindString ?? type.declaration.variant).toLowerCase()) { case 'type literal': - res = parseTypeLiteral(type, map) + res = parseTypeLiteral(type, map, typeArguments) break case 'declaration': if (type.declaration.kind === KIND_TYPE_LITERAL) { - res = parseTypeLiteral(type, map) + res = parseTypeLiteral(type, map, typeArguments) } default: break @@ -673,12 +751,16 @@ function parseReflectionType(type: any, map: Map): TypeDetails | un return res } -function parseTypeLiteral(type: any, map: Map): TypeDetails | undefined { +function parseTypeLiteral( + type: any, + map: Map, + typeArguments?: any +): TypeDetails | undefined { const name = nameOrAnonymous(type) if ('children' in type.declaration) { const properties = type.declaration.children - .map((child: any) => parseTypeInternals(child, map)) + .map((child: any) => parseTypeInternals(child, map, typeArguments)) .filter(Boolean) return { name, @@ -714,14 +796,24 @@ function parseTypeLiteral(type: any, map: Map): TypeDetails | undef return undefined } -function parseIndexedAccessType(type: any, map: Map) { +function parseIndexedAccessType( + type: any, + map: Map, + _typeArguments?: any, + _debug = false +) { return { type: 'nameOnly', name: `${type.objectType?.name ?? ''}['${type.indexType.value ?? type.indexType.name ?? ''}']`, } } -function parseTypeOperatorType(type: any, map: Map) { +function parseTypeOperatorType( + type: any, + map: Map, + _typeArguments?: any, + _debug = false +) { switch (type.operator) { case 'readonly': return parseType(type.target, map) @@ -745,11 +837,11 @@ function parseInterface(type: any, map: Map): CustomObjectType { // This layer is for the sub-types that define a custom type, for example, the // properties of an interface. -function parseTypeInternals(elem: any, map: Map) { +function parseTypeInternals(elem: any, map: Map, typeArguments?: any) { switch ((elem.kindString || elem.variant).toLowerCase()) { case 'property': case 'declaration': - return parseInternalProperty(elem, map) + return parseInternalProperty(elem, map, typeArguments) case 'method': if (elem.signatures?.[0]) { const { params, ret, comment } = parseSignature(elem.signatures?.[0], map) @@ -772,13 +864,13 @@ function parseTypeInternals(elem: any, map: Map) { } } -function parseInternalProperty(elem: any, map: Map) { +function parseInternalProperty(elem: any, map: Map, typeArguments?: any) { const name = nameOrAnonymous(elem) if (!elem.type) { return undefined } - const type = parseType(elem.type, map) + const type = parseType(elem.type, map, typeArguments) const res = { name, diff --git a/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap b/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap index 0eeee322f79..4f2c343f42e 100644 --- a/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap +++ b/apps/docs/features/docs/__snapshots__/Reference.typeSpec.test.ts.snap @@ -5,8 +5,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "@supabase/supabase-js", "methods": { - "@supabase/supabase-js.index.SupabaseClient.constructor": { - "name": "@supabase/supabase-js.index.SupabaseClient.constructor", + "@supabase/supabase-js.SupabaseClient.constructor": { + "name": "@supabase/supabase-js.SupabaseClient.constructor", "params": [ { "name": "supabaseUrl", @@ -57,12 +57,12 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] } } - }, - "comment": { - "shortText": "Optional function for using a third-party authentication system with\\nSupabase. The function should return an access token or ID token (JWT) by\\nobtaining it from the third-party auth client library. Note that this\\nfunction may be called concurrently and many times. Use memoization and\\nlocking techniques if this is not supported by the client libraries.\\n\\nWhen set, the \`auth\` namespace of the Supabase client cannot be used.\\nCreate another client if you wish to use Supabase Auth and third-party\\nauthentications concurrently in the same application." } }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "Optional function for using a third-party authentication system with\\nSupabase. The function should return an access token or ID token (JWT) by\\nobtaining it from the third-party auth client library. Note that this\\nfunction may be called concurrently and many times. Use memoization and\\nlocking techniques if this is not supported by the client libraries.\\n\\nWhen set, the \`auth\` namespace of the Supabase client cannot be used.\\nCreate another client if you wish to use Supabase Auth and third-party\\nauthentications concurrently in the same application." + } }, { "name": "auth", @@ -211,6 +211,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "properties": [ { "name": "fetch", + "type": { + "type": "nameOnly", + "name": "Fetch" + }, "isOptional": true, "comment": { "shortText": "A custom \`fetch\` implementation." @@ -243,7 +247,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "realtime", "type": { "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeClientOptions" + "name": "RealtimeClientOptions" }, "isOptional": true, "comment": { @@ -254,7 +258,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "storage", "type": { "type": "nameOnly", - "name": "@supabase/storage-js.StorageClientOptions" + "name": "StorageClientOptions" }, "isOptional": true } @@ -266,179 +270,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "Database" + "name": "SupabaseClient" } }, "comment": { "shortText": "Create a new client for use in the browser." } }, - "@supabase/supabase-js.index.SupabaseClient._getAccessToken": { - "name": "@supabase/supabase-js.index.SupabaseClient._getAccessToken", - "params": [], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": null - }, - { - "type": "intrinsic", - "name": "string" - } - ] - } - } - } - }, - "@supabase/supabase-js.index.SupabaseClient._handleTokenChanged": { - "name": "@supabase/supabase-js.index.SupabaseClient._handleTokenChanged", - "params": [ - { - "name": "event", - "type": { - "type": "nameOnly", - "name": "@supabase/auth-js.AuthChangeEvent" - } - }, - { - "name": "source", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "CLIENT" - }, - { - "type": "literal", - "value": "STORAGE" - } - ] - } - }, - { - "name": "token", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - } - ], - "ret": { - "type": { - "type": "intrinsic", - "name": "void" - } - } - }, - "@supabase/supabase-js.index.SupabaseClient._initRealtimeClient": { - "name": "@supabase/supabase-js.index.SupabaseClient._initRealtimeClient", - "params": [ - { - "name": "options", - "type": { - "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeClientOptions" - } - } - ], - "ret": { - "type": { - "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeClient" - } - } - }, - "@supabase/supabase-js.index.SupabaseClient._initSupabaseAuthClient": { - "name": "@supabase/supabase-js.index.SupabaseClient._initSupabaseAuthClient", - "params": [ - { - "type": { - "type": "object", - "name": "SupabaseAuthClientOptions", - "properties": [] - } - }, - { - "name": "headers", - "type": { - "type": "record", - "name": "Record", - "keyType": { - "type": "intrinsic", - "name": "string" - }, - "valueType": { - "type": "intrinsic", - "name": "string" - } - }, - "isOptional": true - }, - { - "name": "fetch", - "type": { - "type": "function", - "params": [ - { - "name": "input", - "type": { - "type": "union", - "subTypes": [ - { - "type": "nameOnly", - "name": "RequestInfo" - }, - { - "type": "nameOnly", - "name": "URL" - } - ] - } - }, - { - "name": "init", - "type": { - "type": "nameOnly", - "name": "RequestInit" - }, - "isOptional": true - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "nameOnly", - "name": "Response" - } - } - } - }, - "isOptional": true - } - ], - "ret": { - "type": { - "type": "nameOnly", - "name": "SupabaseAuthClient" - } - } - }, - "@supabase/supabase-js.index.SupabaseClient._listenForAuthEvents": { - "name": "@supabase/supabase-js.index.SupabaseClient._listenForAuthEvents", - "params": [] - }, - "@supabase/supabase-js.index.SupabaseClient.channel": { - "name": "@supabase/supabase-js.index.SupabaseClient.channel", + "@supabase/supabase-js.SupabaseClient.channel": { + "name": "@supabase/supabase-js.SupabaseClient.channel", "params": [ { "name": "name", @@ -454,7 +294,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "opts", "type": { "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeChannelOptions" + "name": "RealtimeChannelOptions" }, "comment": { "shortText": "The options to pass to the Realtime channel." @@ -464,36 +304,30 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeChannel" + "name": "@supabase/realtime-js.default" } }, "comment": { "shortText": "Creates a Realtime channel with Broadcast, Presence, and Postgres Changes." } }, - "@supabase/supabase-js.index.SupabaseClient.from": { - "name": "@supabase/supabase-js.index.SupabaseClient.from", + "@supabase/supabase-js.SupabaseClient.from": { + "name": "@supabase/supabase-js.SupabaseClient.from", "params": [ { "name": "relation", "type": { "type": "nameOnly", "name": "TableName" - }, - "comment": { - "shortText": "The table or view name to query" } } ], "ret": { "type": { "type": "nameOnly", - "name": "@supabase/postgrest-js.PostgrestQueryBuilder" + "name": "@supabase/postgrest-js.default" } }, - "comment": { - "shortText": "Perform a query on a table or a view." - }, "altSignatures": [ { "params": [ @@ -502,33 +336,27 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ViewName" - }, - "comment": { - "shortText": "The table or view name to query" } } ], "ret": { "type": { "type": "nameOnly", - "name": "@supabase/postgrest-js.PostgrestQueryBuilder" + "name": "@supabase/postgrest-js.default" } - }, - "comment": { - "shortText": "Perform a query on a table or a view." } } ] }, - "@supabase/supabase-js.index.SupabaseClient.getChannels": { - "name": "@supabase/supabase-js.index.SupabaseClient.getChannels", + "@supabase/supabase-js.SupabaseClient.getChannels": { + "name": "@supabase/supabase-js.SupabaseClient.getChannels", "params": [], "ret": { "type": { "type": "array", "elemType": { "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeChannel" + "name": "@supabase/realtime-js.default" } } }, @@ -536,8 +364,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "shortText": "Returns all Realtime channels." } }, - "@supabase/supabase-js.index.SupabaseClient.removeAllChannels": { - "name": "@supabase/supabase-js.index.SupabaseClient.removeAllChannels", + "@supabase/supabase-js.SupabaseClient.removeAllChannels": { + "name": "@supabase/supabase-js.SupabaseClient.removeAllChannels", "params": [], "ret": { "type": { @@ -569,14 +397,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "shortText": "Unsubscribes and removes all Realtime channels from Realtime client." } }, - "@supabase/supabase-js.index.SupabaseClient.removeChannel": { - "name": "@supabase/supabase-js.index.SupabaseClient.removeChannel", + "@supabase/supabase-js.SupabaseClient.removeChannel": { + "name": "@supabase/supabase-js.SupabaseClient.removeChannel", "params": [ { "name": "channel", "type": { "type": "nameOnly", - "name": "@supabase/realtime-js.RealtimeChannel" + "name": "@supabase/realtime-js.default" }, "comment": { "shortText": "The name of the Realtime channel." @@ -610,8 +438,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "shortText": "Unsubscribes and removes Realtime channel from Realtime client." } }, - "@supabase/supabase-js.index.SupabaseClient.rpc": { - "name": "@supabase/supabase-js.index.SupabaseClient.rpc", + "@supabase/supabase-js.SupabaseClient.rpc": { + "name": "@supabase/supabase-js.SupabaseClient.rpc", "params": [ { "name": "fn", @@ -694,15 +522,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "@supabase/postgrest-js.PostgrestFilterBuilder" + "name": "@supabase/postgrest-js.default" } }, "comment": { "shortText": "Perform a function call." } }, - "@supabase/supabase-js.index.SupabaseClient.schema": { - "name": "@supabase/supabase-js.index.SupabaseClient.schema", + "@supabase/supabase-js.SupabaseClient.schema": { + "name": "@supabase/supabase-js.SupabaseClient.schema", "params": [ { "name": "schema", @@ -718,7 +546,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "@supabase/postgrest-js.PostgrestClient" + "name": "@supabase/postgrest-js.default" } }, "comment": { @@ -1157,8 +985,21 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "intrinsic", - "name": "string" + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": "length" + }, + { + "type": "literal", + "value": "characters" + }, + { + "type": "literal", + "value": "pwned" + } + ] } } } @@ -1264,6 +1105,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -1293,7 +1137,253 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] } } - ] + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "GoTrueAdminApi" + } + } + }, + "@supabase/auth-js.GoTrueAdminApi.mfa.deleteFactor": { + "name": "@supabase/auth-js.GoTrueAdminApi.mfa.deleteFactor", + "params": [ + { + "name": "params", + "type": { + "name": "AuthMFAAdminDeleteFactorParams", + "type": "object", + "properties": [ + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the MFA factor to delete." + } + }, + { + "name": "userId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the user whose factor is being deleted." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAAdminDeleteFactorResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor that was successfully deleted." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Deletes a factor on a user. This will log the user out of all active\\nsessions if the deleted factor was verified." + } + }, + "@supabase/auth-js.GoTrueAdminApi.mfa.listFactors": { + "name": "@supabase/auth-js.GoTrueAdminApi.mfa.listFactors", + "params": [ + { + "name": "params", + "type": { + "name": "AuthMFAAdminListFactorsParams", + "type": "object", + "properties": [ + { + "name": "userId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the user." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAAdminListFactorsResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "nameOnly", + "name": "Type" + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "nameOnly", + "name": "Status" + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "comment": { + "shortText": "All factors attached to the user." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Lists all factors associated to a user." + } }, "@supabase/auth-js.GoTrueAdminApi.createUser": { "name": "@supabase/auth-js.GoTrueAdminApi.createUser", @@ -1454,6 +1544,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -1554,82 +1645,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -1907,6 +2101,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -2007,82 +2202,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -2332,6 +2630,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "GenerateLinkParams", "subTypes": [ { + "name": "GenerateSignupLinkParams", "type": "object", "properties": [ { @@ -2343,33 +2642,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "options", - "type": { - "type": "union", - "subTypes": [ - { - "name": "data", - "type": { - "type": "intrinsic", - "name": "object" - }, - "isOptional": true, - "comment": { - "shortText": "A custom data object to store the user's metadata. This maps to the \`auth.users.raw_user_meta_data\` column.\\n\\nThe \`data\` should be a JSON object that includes user-specific info, such as their first and last name." - } - }, - { - "name": "redirectTo", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "The URL which will be appended to the email link generated." - } - } - ] - }, "isOptional": true }, { @@ -2389,6 +2661,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] }, { + "name": "GenerateInviteOrMagiclinkParams", "type": "object", "properties": [ { @@ -2403,33 +2676,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "options", - "type": { - "type": "union", - "subTypes": [ - { - "name": "data", - "type": { - "type": "intrinsic", - "name": "object" - }, - "isOptional": true, - "comment": { - "shortText": "A custom data object to store the user's metadata. This maps to the \`auth.users.raw_user_meta_data\` column.\\n\\nThe \`data\` should be a JSON object that includes user-specific info, such as their first and last name." - } - }, - { - "name": "redirectTo", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "The URL which will be appended to the email link generated." - } - } - ] - }, "isOptional": true }, { @@ -2451,6 +2697,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] }, { + "name": "GenerateRecoveryLinkParams", "type": "object", "properties": [ { @@ -2465,17 +2712,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "options", - "type": { - "name": "redirectTo", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "The URL which will be appended to the email link generated." - } - }, "isOptional": true }, { @@ -2488,6 +2724,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] }, { + "name": "GenerateEmailChangeLinkParams", "type": "object", "properties": [ { @@ -2512,17 +2749,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "options", - "type": { - "name": "redirectTo", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "The URL which will be appended to the email link generated." - } - }, "isOptional": true }, { @@ -2561,6 +2787,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -2746,82 +2973,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -3096,6 +3426,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -3196,82 +3527,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -3572,6 +4006,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -3672,82 +4107,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -4323,6 +4861,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -4423,82 +4962,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -4918,15 +5560,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "R" } } - }, - "comment": { - "shortText": "Provide your own global lock implementation instead of the default\\nimplementation. The function should acquire a lock for the duration of the\\n\`fn\` async function, such that no other client instances will be able to\\nhold it at the same time.", - "tags": [ - { - "tag": "experimental", - "text": "" - } - ] } }, "isOptional": true, @@ -4950,6 +5583,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "storage", + "type": { + "type": "nameOnly", + "name": "SupportedStorage" + }, "isOptional": true }, { @@ -4970,6 +5607,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "userStorage", + "type": { + "type": "nameOnly", + "name": "SupportedStorage" + }, "isOptional": true, "comment": { "shortText": "Stores the user object in a separate storage location from the rest of the session data. When non-null, \`storage\` will only store a JSON object containing the access and refresh token and some adjacent metadata, while \`userStorage\` will only contain the user object under the key \`storageKey + '-user'\`.\\n\\nWhen this option is set and cookie storage is used, \`getSession()\` and other functions that load a session from the cookie store might not return back a user. It's very important to always use \`getUser()\` to fetch a user object in those scenarios.", @@ -4985,10 +5626,4294 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ], + "ret": { + "type": { + "type": "nameOnly", + "name": "GoTrueClient" + } + }, "comment": { "shortText": "Create a new client for use in the browser." } }, + "@supabase/auth-js.GoTrueClient.mfa.challenge": { + "name": "@supabase/auth-js.GoTrueClient.mfa.challenge", + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor to be challenged. Returned in enroll()." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "AuthError" + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "object", + "properties": [ + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Timestamp in UNIX seconds when this challenge will no longer be usable." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the newly created challenge." + } + }, + { + "name": "type", + "type": { + "type": "literal", + "value": "totp" + }, + "comment": { + "shortText": "Factor Type which generated the challenge" + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Prepares a challenge used to verify that a user has access to a MFA\\nfactor." + }, + "altSignatures": [ + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "channel", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": "sms" + }, + { + "type": "literal", + "value": "whatsapp" + } + ] + }, + "comment": { + "shortText": "Messaging channel to use (e.g. whatsapp or sms). Only relevant for phone factors" + } + }, + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor to be challenged. Returned in enroll()." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "AuthError" + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "object", + "properties": [ + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Timestamp in UNIX seconds when this challenge will no longer be usable." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the newly created challenge." + } + }, + { + "name": "type", + "type": { + "type": "literal", + "value": "phone" + }, + "comment": { + "shortText": "Factor Type which generated the challenge" + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor to be challenged. Returned in enroll()." + } + }, + { + "name": "webauthn", + "type": { + "type": "object", + "properties": [ + { + "name": "rpId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Relying party ID" + } + }, + { + "name": "rpOrigins", + "type": { + "type": "array", + "elemType": { + "type": "intrinsic", + "name": "string" + } + }, + "isOptional": true, + "comment": { + "shortText": "Relying party origins" + } + } + ] + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "AuthError" + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "object", + "properties": [ + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Timestamp in UNIX seconds when this challenge will no longer be usable." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the newly created challenge." + } + }, + { + "name": "type", + "type": { + "type": "literal", + "value": "webauthn" + }, + "comment": { + "shortText": "Factor Type which generated the challenge" + } + }, + { + "name": "webauthn", + "type": { + "type": "union", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "credential_options", + "type": { + "type": "object", + "properties": [ + { + "name": "publicKey", + "type": { + "type": "nameOnly", + "name": "PublicKeyCredentialCreationOptionsFuture" + } + } + ] + } + }, + { + "name": "type", + "type": { + "type": "literal", + "value": "create" + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "credential_options", + "type": { + "type": "object", + "properties": [ + { + "name": "publicKey", + "type": { + "type": "nameOnly", + "name": "PublicKeyCredentialRequestOptionsFuture" + } + } + ] + } + }, + { + "name": "type", + "type": { + "type": "literal", + "value": "request" + } + } + ] + } + ] + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "union", + "name": "MFAChallengeParams", + "subTypes": [ + { + "type": "nameOnly", + "name": "MFAChallengeTOTPParams" + }, + { + "type": "nameOnly", + "name": "MFAChallengePhoneParams" + }, + { + "type": "nameOnly", + "name": "MFAChallengeWebauthnParams" + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAChallengeResponse", + "subTypes": [ + { + "type": "union", + "name": "AuthMFAChallengeTOTPResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + }, + { + "type": "union", + "name": "AuthMFAChallengePhoneResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + }, + { + "type": "union", + "name": "AuthMFAChallengeWebauthnResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + ] + } + } + } + } + ] + }, + "@supabase/auth-js.GoTrueClient.mfa.challengeAndVerify": { + "name": "@supabase/auth-js.GoTrueClient.mfa.challengeAndVerify", + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "code", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Verification code provided by the user." + } + }, + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor being verified. Returned in enroll()." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAVerifyResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "New access token (JWT) after successful verification." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Number of seconds in which the access token will expire." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Refresh token you can use to obtain new access tokens when expired." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + }, + "comment": { + "shortText": "Type of token, always \`bearer\`." + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "Updated user profile." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Helper method which creates a challenge and immediately uses the given code to verify against it thereafter. The verification code is\\nprovided by the user by entering a code seen in their authenticator app." + } + }, + "@supabase/auth-js.GoTrueClient.mfa.enroll": { + "name": "@supabase/auth-js.GoTrueClient.mfa.enroll", + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "factorType", + "type": { + "type": "literal", + "value": "totp" + }, + "comment": { + "shortText": "The type of factor being enrolled." + } + }, + { + "name": "friendlyName", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Human readable name assigned to the factor." + } + }, + { + "name": "issuer", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Domain which the user is enrolled with." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAEnrollTOTPResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Starts the enrollment process for a new Multi-Factor Authentication (MFA)\\nfactor. This method creates a new \`unverified\` factor.\\nTo verify a factor, present the QR code or secret to the user and ask them to add it to their\\nauthenticator app.\\nThe user has to enter the code from their authenticator app to verify it.\\n\\nUpon verifying a factor, all other sessions are logged out and the current session's authenticator level is promoted to \`aal2\`." + }, + "altSignatures": [ + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "factorType", + "type": { + "type": "literal", + "value": "phone" + }, + "comment": { + "shortText": "The type of factor being enrolled." + } + }, + { + "name": "friendlyName", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Human readable name assigned to the factor." + } + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Phone number associated with a factor. Number should conform to E.164 format" + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAEnrollPhoneResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "factorType", + "type": { + "type": "literal", + "value": "webauthn" + }, + "comment": { + "shortText": "The type of factor being enrolled." + } + }, + { + "name": "friendlyName", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Human readable name assigned to the factor." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAEnrollWebauthnResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "union", + "name": "MFAEnrollParams", + "subTypes": [ + { + "type": "nameOnly", + "name": "MFAEnrollTOTPParams" + }, + { + "type": "nameOnly", + "name": "MFAEnrollPhoneParams" + }, + { + "type": "nameOnly", + "name": "MFAEnrollWebauthnParams" + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAEnrollResponse", + "subTypes": [ + { + "type": "union", + "name": "AuthMFAEnrollTOTPResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + }, + { + "type": "union", + "name": "AuthMFAEnrollPhoneResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + }, + { + "type": "union", + "name": "AuthMFAEnrollWebauthnResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + ] + } + } + } + } + ] + }, + "@supabase/auth-js.GoTrueClient.mfa.getAuthenticatorAssuranceLevel": { + "name": "@supabase/auth-js.GoTrueClient.mfa.getAuthenticatorAssuranceLevel", + "params": [], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAGetAuthenticatorAssuranceLevelResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "currentAuthenticationMethods", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "AMREntry", + "properties": [ + { + "name": "method", + "type": { + "type": "union", + "name": "AMRMethod", + "subTypes": [ + { + "type": "nameOnly", + "name": "['number']" + }, + null + ] + }, + "comment": { + "shortText": "Authentication method name." + } + }, + { + "name": "timestamp", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Timestamp when the method was successfully used. Represents number of\\nseconds since 1st January 1970 (UNIX epoch) in UTC." + } + } + ] + } + }, + "comment": { + "shortText": "A list of all authentication methods attached to this session. Use\\nthe information here to detect the last time a user verified a\\nfactor, for example if implementing a step-up scenario." + } + }, + { + "name": "currentLevel", + "type": { + "type": "union", + "subTypes": [ + { + "type": "union", + "name": "AuthenticatorAssuranceLevels", + "subTypes": [ + { + "type": "literal", + "value": "aal1" + }, + { + "type": "literal", + "value": "aal2" + } + ] + }, + { + "type": "literal", + "value": null + } + ] + }, + "comment": { + "shortText": "Current AAL level of the session." + } + }, + { + "name": "nextLevel", + "type": { + "type": "union", + "subTypes": [ + { + "type": "union", + "name": "AuthenticatorAssuranceLevels", + "subTypes": [ + { + "type": "literal", + "value": "aal1" + }, + { + "type": "literal", + "value": "aal2" + } + ] + }, + { + "type": "literal", + "value": null + } + ] + }, + "comment": { + "shortText": "Next possible AAL level for the session. If the next level is higher\\nthan the current one, the user should go through MFA." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Returns the Authenticator Assurance Level (AAL) for the active session.\\n\\n- \`aal1\` (or \`null\`) means that the user's identity has been verified only\\nwith a conventional login (email+password, OTP, magic link, social login,\\netc.).\\n- \`aal2\` means that the user's identity has been verified both with a conventional login and at least one MFA factor.\\n\\nAlthough this method returns a promise, it's fairly quick (microseconds)\\nand rarely uses the network. You can use this to check whether the current\\nuser needs to be shown a screen to verify their MFA factors." + } + }, + "@supabase/auth-js.GoTrueClient.mfa.listFactors": { + "name": "@supabase/auth-js.GoTrueClient.mfa.listFactors", + "params": [], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAListFactorsResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data" + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Returns the list of MFA factors enabled for this user." + } + }, + "@supabase/auth-js.GoTrueClient.mfa.unenroll": { + "name": "@supabase/auth-js.GoTrueClient.mfa.unenroll", + "params": [ + { + "name": "params", + "type": { + "name": "MFAUnenrollParams", + "type": "object", + "properties": [ + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor being unenrolled." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAUnenrollResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor that was successfully unenrolled." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Unenroll removes a MFA factor.\\nA user has to have an \`aal2\` authenticator level in order to unenroll a \`verified\` factor." + } + }, + "@supabase/auth-js.GoTrueClient.mfa.verify": { + "name": "@supabase/auth-js.GoTrueClient.mfa.verify", + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "challengeId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the challenge being verified. Returned in challenge()." + } + }, + { + "name": "code", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Verification code provided by the user." + } + }, + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor being verified. Returned in enroll()." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAVerifyResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "New access token (JWT) after successful verification." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Number of seconds in which the access token will expire." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Refresh token you can use to obtain new access tokens when expired." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + }, + "comment": { + "shortText": "Type of token, always \`bearer\`." + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "Updated user profile." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Verifies a code against a challenge. The verification code is\\nprovided by the user by entering a code seen in their authenticator app." + }, + "altSignatures": [ + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "challengeId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the challenge being verified. Returned in challenge()." + } + }, + { + "name": "code", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Verification code provided by the user." + } + }, + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor being verified. Returned in enroll()." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAVerifyResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "New access token (JWT) after successful verification." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Number of seconds in which the access token will expire." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Refresh token you can use to obtain new access tokens when expired." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + }, + "comment": { + "shortText": "Type of token, always \`bearer\`." + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "Updated user profile." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "object", + "properties": [ + { + "name": "challengeId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the challenge being verified. Returned in challenge()." + } + }, + { + "name": "factorId", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor being verified. Returned in enroll()." + } + }, + { + "name": "webauthn" + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAVerifyResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "New access token (JWT) after successful verification." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Number of seconds in which the access token will expire." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Refresh token you can use to obtain new access tokens when expired." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + }, + "comment": { + "shortText": "Type of token, always \`bearer\`." + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "Updated user profile." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + } + }, + { + "params": [ + { + "name": "params", + "type": { + "type": "union", + "name": "MFAVerifyParams", + "subTypes": [ + { + "type": "nameOnly", + "name": "MFAVerifyTOTPParams" + }, + { + "type": "nameOnly", + "name": "MFAVerifyPhoneParams" + }, + { + "type": "nameOnly", + "name": "MFAVerifyWebauthnParams" + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthMFAVerifyResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "New access token (JWT) after successful verification." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "Number of seconds in which the access token will expire." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "Refresh token you can use to obtain new access tokens when expired." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + }, + "comment": { + "shortText": "Type of token, always \`bearer\`." + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "Updated user profile." + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error" + } + ] + } + ] + } + } + } + } + ] + }, "@supabase/auth-js.GoTrueClient.exchangeCodeForSession": { "name": "@supabase/auth-js.GoTrueClient.exchangeCodeForSession", "params": [ @@ -5014,6 +9939,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -5106,8 +10032,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -5208,82 +10134,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -5580,82 +10609,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -6309,8 +11441,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -6411,82 +11543,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -6788,6 +12023,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -6888,82 +12124,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -7809,7 +13148,1214 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, "comment": { "shortText": "Links an oauth identity to an existing user.\\nThis method supports the PKCE flow." - } + }, + "altSignatures": [ + { + "params": [ + { + "name": "credentials", + "type": { + "name": "SignInWithIdTokenCredentials", + "type": "object", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "If the ID token contains an \`at_hash\` claim, then the hash of this value is compared to the value in the ID token." + } + }, + { + "name": "nonce", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "If the ID token contains a \`nonce\` claim, then the hash of this value is compared to the value in the ID token." + } + }, + { + "name": "options", + "type": { + "type": "object", + "properties": [ + { + "name": "captchaToken", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Verification token received when the user completes the captcha on the site." + } + } + ] + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": "google" + }, + { + "type": "literal", + "value": "apple" + }, + { + "type": "literal", + "value": "azure" + }, + { + "type": "literal", + "value": "facebook" + }, + { + "type": "literal", + "value": "kakao" + }, + null + ] + }, + "comment": { + "shortText": "Provider name or OIDC \`iss\` value identifying which provider should be used to verify the provided token. Supported names: \`google\`, \`apple\`, \`azure\`, \`facebook\`, \`kakao\`, \`keycloak\` (deprecated)." + } + }, + { + "name": "token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "OIDC ID token issued by the specified provider. The \`iss\` claim in the ID token must match the supplied provider. Some ID tokens contain an \`at_hash\` which require that you provide an \`access_token\` value to be accepted properly. If the token contains a \`nonce\` claim you must supply the nonce used to obtain the ID token." + } + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "name": "AuthTokenResponse", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "name": "T", + "type": "object", + "properties": [ + { + "name": "session", + "type": { + "type": "object", + "name": "Session", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "The access token jwt. It is recommended to set the JWT_EXPIRY to a shorter expiry value." + } + }, + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "isOptional": true, + "comment": { + "shortText": "A timestamp of when the token will expire. Returned when a login is confirmed." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "The number of seconds until the token expires (since it was issued). Returned when a login is confirmed." + } + }, + { + "name": "provider_refresh_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider refresh token. If present, this can be used to refresh the provider_token via the oauth provider's API.\\nNot all oauth providers return a provider refresh token. If the provider_refresh_token is missing, please refer to the oauth provider's documentation for information on how to obtain the provider refresh token." + } + }, + { + "name": "provider_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider token. If present, this can be used to make external API requests to the oauth provider used." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "A one-time used refresh token that never expires." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "When using a separate user storage, accessing properties of this object will throw an error." + } + } + ] + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "object", + "properties": [ + { + "name": "session", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "user", + "type": { + "type": "literal", + "value": null + } + } + ] + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "AuthError" + } + } + ] + } + ] + } + } + }, + "comment": { + "shortText": "Links an OIDC identity to an existing user." + } + } + ] }, "@supabase/auth-js.GoTrueClient.onAuthStateChange": { "name": "@supabase/auth-js.GoTrueClient.onAuthStateChange", @@ -7851,7 +14397,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "literal", - "value": "MFA_CHALLENGE_VERIFIED" + "value": "MFA_CHALLENGE_VERIFIED", + "name": "AuthChangeEventMFA" } ] } @@ -7953,8 +14500,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -8055,82 +14602,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -8334,21 +14984,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "union", - "subTypes": [ - { - "type": "intrinsic", - "name": "void" - }, - { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "intrinsic", - "name": "void" - } - } - ] + "type": "intrinsic", + "name": "void" } } }, @@ -8409,7 +15046,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "literal", - "value": "MFA_CHALLENGE_VERIFIED" + "value": "MFA_CHALLENGE_VERIFIED", + "name": "AuthChangeEventMFA" } ] } @@ -8511,8 +15149,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -8613,82 +15251,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -8895,10 +15636,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "void" } - }, - "comment": { - "shortText": "The function to call every time there is an event. eg: (eventName) => {}" } + }, + "comment": { + "shortText": "The function to call every time there is an event. eg: (eventName) => {}" } }, { @@ -8921,10 +15662,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "void" } - }, - "comment": { - "shortText": "Call this to remove the listener." } + }, + "comment": { + "shortText": "Call this to remove the listener." } } ] @@ -8937,8 +15678,1337 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } }, "comment": { - "shortText": "Receive a notification every time an auth event happens." - } + "shortText": "Receive a notification every time an auth event happens.\\nSafe to use without an async function as callback." + }, + "altSignatures": [ + { + "params": [ + { + "name": "callback", + "type": { + "type": "function", + "params": [ + { + "name": "event", + "type": { + "type": "union", + "name": "AuthChangeEvent", + "subTypes": [ + { + "type": "literal", + "value": "INITIAL_SESSION" + }, + { + "type": "literal", + "value": "PASSWORD_RECOVERY" + }, + { + "type": "literal", + "value": "SIGNED_IN" + }, + { + "type": "literal", + "value": "SIGNED_OUT" + }, + { + "type": "literal", + "value": "TOKEN_REFRESHED" + }, + { + "type": "literal", + "value": "USER_UPDATED" + }, + { + "type": "literal", + "value": "MFA_CHALLENGE_VERIFIED", + "name": "AuthChangeEventMFA" + } + ] + } + }, + { + "name": "session", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "object", + "name": "Session", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "The access token jwt. It is recommended to set the JWT_EXPIRY to a shorter expiry value." + } + }, + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "isOptional": true, + "comment": { + "shortText": "A timestamp of when the token will expire. Returned when a login is confirmed." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "The number of seconds until the token expires (since it was issued). Returned when a login is confirmed." + } + }, + { + "name": "provider_refresh_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider refresh token. If present, this can be used to refresh the provider_token via the oauth provider's API.\\nNot all oauth providers return a provider refresh token. If the provider_refresh_token is missing, please refer to the oauth provider's documentation for information on how to obtain the provider refresh token." + } + }, + { + "name": "provider_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider token. If present, this can be used to make external API requests to the oauth provider used." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "A one-time used refresh token that never expires." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "When using a separate user storage, accessing properties of this object will throw an error." + } + } + ] + } + ] + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "intrinsic", + "name": "void" + } + } + } + }, + "comment": { + "shortText": "A callback function to be invoked when an auth event happens." + } + } + ], + "ret": { + "type": { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "object", + "properties": [ + { + "name": "subscription", + "type": { + "type": "object", + "name": "Subscription", + "properties": [ + { + "name": "callback", + "type": { + "type": "function", + "params": [ + { + "name": "event", + "type": { + "type": "union", + "name": "AuthChangeEvent", + "subTypes": [ + { + "type": "literal", + "value": "INITIAL_SESSION" + }, + { + "type": "literal", + "value": "PASSWORD_RECOVERY" + }, + { + "type": "literal", + "value": "SIGNED_IN" + }, + { + "type": "literal", + "value": "SIGNED_OUT" + }, + { + "type": "literal", + "value": "TOKEN_REFRESHED" + }, + { + "type": "literal", + "value": "USER_UPDATED" + }, + { + "type": "literal", + "value": "MFA_CHALLENGE_VERIFIED", + "name": "AuthChangeEventMFA" + } + ] + } + }, + { + "name": "session", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "object", + "name": "Session", + "properties": [ + { + "name": "access_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "The access token jwt. It is recommended to set the JWT_EXPIRY to a shorter expiry value." + } + }, + { + "name": "expires_at", + "type": { + "type": "intrinsic", + "name": "number" + }, + "isOptional": true, + "comment": { + "shortText": "A timestamp of when the token will expire. Returned when a login is confirmed." + } + }, + { + "name": "expires_in", + "type": { + "type": "intrinsic", + "name": "number" + }, + "comment": { + "shortText": "The number of seconds until the token expires (since it was issued). Returned when a login is confirmed." + } + }, + { + "name": "provider_refresh_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider refresh token. If present, this can be used to refresh the provider_token via the oauth provider's API.\\nNot all oauth providers return a provider refresh token. If the provider_refresh_token is missing, please refer to the oauth provider's documentation for information on how to obtain the provider refresh token." + } + }, + { + "name": "provider_token", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "intrinsic", + "name": "string" + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The oauth provider token. If present, this can be used to make external API requests to the oauth provider used." + } + }, + { + "name": "refresh_token", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "A one-time used refresh token that never expires." + } + }, + { + "name": "token_type", + "type": { + "type": "literal", + "value": "bearer" + } + }, + { + "name": "user", + "type": { + "type": "object", + "name": "User", + "properties": [ + { + "name": "action_link", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "app_metadata", + "type": { + "type": "object", + "name": "UserAppMetadata", + "properties": [ + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + } + ] + } + }, + { + "name": "aud", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "confirmation_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "deleted_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_change_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "email_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "factors", + "type": { + "type": "array", + "elemType": { + "type": "union", + "subTypes": [ + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + }, + { + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + ] + } + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identities", + "type": { + "type": "array", + "elemType": { + "type": "object", + "name": "UserIdentity", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "identity_data", + "type": { + "type": "index signature", + "keyType": { + "type": "intrinsic", + "name": "string" + }, + "valueType": { + "type": "intrinsic", + "name": "any" + } + }, + "isOptional": true + }, + { + "name": "identity_id", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "provider", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_id", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] + } + }, + "isOptional": true + }, + { + "name": "invited_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "is_anonymous", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "is_sso_user", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + }, + { + "name": "last_sign_in_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_email", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "new_phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "phone_confirmed_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "recovery_sent_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "role", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true + }, + { + "name": "user_metadata", + "type": { + "type": "object", + "name": "UserMetadata", + "properties": [] + } + } + ] + }, + "comment": { + "shortText": "When using a separate user storage, accessing properties of this object will throw an error." + } + } + ] + } + ] + } + } + ], + "ret": { + "type": { + "type": "intrinsic", + "name": "void" + } + } + }, + "comment": { + "shortText": "The function to call every time there is an event. eg: (eventName) => {}" + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "The subscriber UUID. This will be set by the client." + } + }, + { + "name": "unsubscribe", + "type": { + "type": "function", + "params": [], + "ret": { + "type": { + "type": "intrinsic", + "name": "void" + } + } + }, + "comment": { + "shortText": "Call this to remove the listener." + } + } + ] + } + } + ] + } + } + ] + } + }, + "comment": { + "shortText": "Avoid using an async function inside \`onAuthStateChange\` as you might end\\nup with a deadlock. The callback function runs inside an exclusive lock,\\nso calling other Supabase Client APIs that also try to acquire the\\nexclusive lock, might cause a deadlock. This behavior is observable across\\ntabs. In the next major library version, this behavior will not be supported.\\n\\nReceive a notification every time an auth event happens." + } + } + ] }, "@supabase/auth-js.GoTrueClient.reauthenticate": { "name": "@supabase/auth-js.GoTrueClient.reauthenticate", @@ -8957,6 +17027,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -9052,8 +17123,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -9154,82 +17225,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -9535,82 +17709,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -9900,6 +18177,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -9995,8 +18273,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -10097,82 +18375,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -10478,82 +18859,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -10940,6 +19424,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -10996,19 +19481,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "messageId", "type": { - "type": "union", - "subTypes": [ - { - "type": "intrinsic", - "name": "string" - }, - { - "type": "literal", - "value": null - } - ] - }, - "isOptional": true + "type": "literal", + "value": null + } }, { "name": "session", @@ -11180,6 +19655,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -11275,8 +19751,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -11377,82 +19853,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -11758,82 +20337,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -12145,6 +20827,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -12240,8 +20923,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -12342,82 +21025,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -12723,82 +21509,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -13162,6 +22051,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -13254,8 +22144,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -13356,82 +22246,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -13728,82 +22721,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -14659,6 +23755,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -14715,19 +23812,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "messageId", "type": { - "type": "union", - "subTypes": [ - { - "type": "intrinsic", - "name": "string" - }, - { - "type": "literal", - "value": null - } - ] - }, - "isOptional": true + "type": "literal", + "value": null + } }, { "name": "session", @@ -14769,100 +23856,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "credentials", "type": { - "type": "union", - "name": "SignInWithPasswordCredentials", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's email address." - } - }, - { - "name": "options", - "type": { - "type": "object", - "properties": [ - { - "name": "captchaToken", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Verification token received when the user completes the captcha on the site." - } - } - ] - }, - "isOptional": true - }, - { - "name": "password", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's password." - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "options", - "type": { - "type": "object", - "properties": [ - { - "name": "captchaToken", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Verification token received when the user completes the captcha on the site." - } - } - ] - }, - "isOptional": true - }, - { - "name": "password", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's password." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's phone number." - } - } - ] - } - ] + "type": "nameOnly", + "name": "SignInWithPasswordCredentials" } } ], @@ -14880,6 +23875,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -14972,8 +23968,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -15074,82 +24070,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -15446,82 +24545,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -15732,23 +24934,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "union", - "name": "WeakPasswordReasons", - "subTypes": [ - { - "type": "literal", - "value": "length" - }, - { - "type": "literal", - "value": "characters" - }, - { - "type": "literal", - "value": "pwned" - }, - null - ] + "type": "nameOnly", + "name": "WeakPasswordReasons" } } } @@ -15795,8 +24982,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "literal", "value": null - }, - "isOptional": true + } } ] } @@ -15937,6 +25123,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -15972,11 +25159,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } }, { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } + "name": "error" } ] } @@ -15999,6 +25182,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "subTypes": [ { "type": "union", + "name": "SolanaWeb3Credentials", "subTypes": [ { "type": "object", @@ -16255,6 +25439,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "union", + "name": "EthereumWeb3Credentials", "subTypes": [ { "type": "object", @@ -16492,8 +25677,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -16594,82 +25779,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -16966,82 +26254,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -17362,153 +26753,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "credentials", "type": { - "type": "union", - "name": "SignUpWithPasswordCredentials", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's email address." - } - }, - { - "name": "options", - "type": { - "type": "object", - "properties": [ - { - "name": "captchaToken", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Verification token received when the user completes the captcha on the site." - } - }, - { - "name": "data", - "type": { - "type": "intrinsic", - "name": "object" - }, - "isOptional": true, - "comment": { - "shortText": "A custom data object to store the user's metadata. This maps to the \`auth.users.raw_user_meta_data\` column.\\n\\nThe \`data\` should be a JSON object that includes user-specific info, such as their first and last name." - } - }, - { - "name": "emailRedirectTo", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "The redirect url embedded in the email link" - } - } - ] - }, - "isOptional": true - }, - { - "name": "password", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's password." - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "options", - "type": { - "type": "object", - "properties": [ - { - "name": "captchaToken", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Verification token received when the user completes the captcha on the site. Requires a configured WhatsApp sender on Twilio" - } - }, - { - "name": "channel", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "sms" - }, - { - "type": "literal", - "value": "whatsapp" - } - ] - }, - "isOptional": true, - "comment": { - "shortText": "Messaging channel to use (e.g. whatsapp or sms)" - } - }, - { - "name": "data", - "type": { - "type": "intrinsic", - "name": "object" - }, - "isOptional": true, - "comment": { - "shortText": "A custom data object to store the user's metadata. This maps to the \`auth.users.raw_user_meta_data\` column.\\n\\nThe \`data\` should be a JSON object that includes user-specific info, such as their first and last name." - } - } - ] - }, - "isOptional": true - }, - { - "name": "password", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's password." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The user's phone number." - } - } - ] - } - ] + "type": "nameOnly", + "name": "SignUpWithPasswordCredentials" } } ], @@ -17526,6 +26772,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -17621,8 +26868,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -17723,82 +26970,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -18104,82 +27454,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -18693,6 +28146,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -18793,82 +28247,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -19357,6 +28914,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "data", "type": { + "name": "T", "type": "object", "properties": [ { @@ -19452,8 +29010,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "token_type", "type": { - "type": "intrinsic", - "name": "string" + "type": "literal", + "value": "bearer" } }, { @@ -19554,82 +29112,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -19935,82 +29596,185 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "array", "elemType": { - "type": "object", - "name": "Factor", - "properties": [ + "type": "union", + "subTypes": [ { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] }, - { - "type": "literal", - "value": "unverified" + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" } - ] - }, - "comment": { - "shortText": "Factor's status." - } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] }, { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } + "name": "Factor", + "type": "object", + "properties": [ + { + "name": "created_at", + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "name": "factor_type", + "type": { + "type": "union", + "name": "Type", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" + } + }, + { + "name": "friendly_name", + "type": { + "type": "intrinsic", + "name": "string" + }, + "isOptional": true, + "comment": { + "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." + } + }, + { + "name": "id", + "type": { + "type": "intrinsic", + "name": "string" + }, + "comment": { + "shortText": "ID of the factor." + } + }, + { + "name": "status", + "type": { + "type": "union", + "name": "Status", + "subTypes": [ + { + "type": "literal", + "value": "webauthn" + }, + { + "type": "literal", + "value": "totp" + }, + { + "type": "literal", + "value": "phone" + } + ] + }, + "comment": { + "shortText": "The verification status of the factor, default is \`unverified\` after \`.enroll()\`, then \`verified\` after the user verifies it with \`.verify()\`" + } + }, + { + "name": "updated_at", + "type": { + "type": "intrinsic", + "name": "string" + } + } + ] } ] } @@ -20280,2603 +30044,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "NavigatorLockAcquireTimeoutError" } } - }, - "@supabase/auth-js.GoTrueAdminMFAApi.deleteFactor": { - "name": "@supabase/auth-js.GoTrueAdminMFAApi.deleteFactor", - "params": [ - { - "name": "params", - "type": { - "name": "AuthMFAAdminDeleteFactorParams", - "type": "object", - "properties": [ - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the MFA factor to delete." - } - }, - { - "name": "userId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the user whose factor is being deleted." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAAdminDeleteFactorResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was successfully deleted." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Deletes a factor on a user. This will log the user out of all active\\nsessions if the deleted factor was verified." - } - }, - "@supabase/auth-js.GoTrueAdminMFAApi.listFactors": { - "name": "@supabase/auth-js.GoTrueAdminMFAApi.listFactors", - "params": [ - { - "name": "params", - "type": { - "name": "AuthMFAAdminListFactorsParams", - "type": "object", - "properties": [ - { - "name": "userId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the user." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAAdminListFactorsResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "factors", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "comment": { - "shortText": "All factors attached to the user." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Lists all factors associated to a user." - } - }, - "@supabase/auth-js.GoTrueMFAApi.challenge": { - "name": "@supabase/auth-js.GoTrueMFAApi.challenge", - "params": [ - { - "name": "params", - "type": { - "name": "MFAChallengeParams", - "type": "object", - "properties": [ - { - "name": "channel", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "sms" - }, - { - "type": "literal", - "value": "whatsapp" - } - ] - }, - "isOptional": true, - "comment": { - "shortText": "Messaging channel to use (e.g. whatsapp or sms). Only relevant for phone factors" - } - }, - { - "name": "factorId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor to be challenged. Returned in enroll()." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAChallengeResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "expires_at", - "type": { - "type": "intrinsic", - "name": "number" - }, - "comment": { - "shortText": "Timestamp in UNIX seconds when this challenge will no longer be usable." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the newly created challenge." - } - }, - { - "name": "type", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Factor Type which generated the challenge" - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Prepares a challenge used to verify that a user has access to a MFA\\nfactor." - } - }, - "@supabase/auth-js.GoTrueMFAApi.challengeAndVerify": { - "name": "@supabase/auth-js.GoTrueMFAApi.challengeAndVerify", - "params": [ - { - "name": "params", - "type": { - "name": "MFAChallengeAndVerifyParams", - "type": "object", - "properties": [ - { - "name": "code", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Verification code provided by the user." - } - }, - { - "name": "factorId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor being verified. Returned in enroll()." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAVerifyResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "access_token", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "New access token (JWT) after successful verification." - } - }, - { - "name": "expires_in", - "type": { - "type": "intrinsic", - "name": "number" - }, - "comment": { - "shortText": "Number of seconds in which the access token will expire." - } - }, - { - "name": "refresh_token", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Refresh token you can use to obtain new access tokens when expired." - } - }, - { - "name": "token_type", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Type of token, typically \`Bearer\`." - } - }, - { - "name": "user", - "type": { - "type": "object", - "name": "User", - "properties": [ - { - "name": "action_link", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "app_metadata", - "type": { - "type": "object", - "name": "UserAppMetadata", - "properties": [ - { - "name": "provider", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - } - ] - } - }, - { - "name": "aud", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "confirmation_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "deleted_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email_change_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email_confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "factors", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "isOptional": true - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "identities", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "UserIdentity", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "identity_data", - "type": { - "type": "index signature", - "keyType": { - "type": "intrinsic", - "name": "string" - }, - "valueType": { - "type": "intrinsic", - "name": "any" - } - }, - "isOptional": true - }, - { - "name": "identity_id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "last_sign_in_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "provider", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "user_id", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "isOptional": true - }, - { - "name": "invited_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "is_anonymous", - "type": { - "type": "intrinsic", - "name": "boolean" - }, - "isOptional": true - }, - { - "name": "is_sso_user", - "type": { - "type": "intrinsic", - "name": "boolean" - }, - "isOptional": true - }, - { - "name": "last_sign_in_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "new_email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "new_phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "phone_confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "recovery_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "role", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "user_metadata", - "type": { - "type": "object", - "name": "UserMetadata", - "properties": [] - } - } - ] - }, - "comment": { - "shortText": "Updated user profile." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Helper method which creates a challenge and immediately uses the given code to verify against it thereafter. The verification code is\\nprovided by the user by entering a code seen in their authenticator app." - } - }, - "@supabase/auth-js.GoTrueMFAApi.enroll": { - "name": "@supabase/auth-js.GoTrueMFAApi.enroll", - "params": [ - { - "name": "params", - "type": { - "name": "MFAEnrollTOTPParams", - "type": "object", - "properties": [ - { - "name": "factorType", - "type": { - "type": "literal", - "value": "totp" - }, - "comment": { - "shortText": "The type of factor being enrolled." - } - }, - { - "name": "friendlyName", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Human readable name assigned to the factor." - } - }, - { - "name": "issuer", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Domain which the user is enrolled with." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAEnrollTOTPResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful for distinguishing between factors *" - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was just enrolled (in an unverified state)." - } - }, - { - "name": "totp", - "type": { - "type": "object", - "properties": [ - { - "name": "qr_code", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Contains a QR code encoding the authenticator URI. You can\\nconvert it to a URL by prepending \`data:image/svg+xml;utf-8,\` to\\nthe value. Avoid logging this value to the console." - } - }, - { - "name": "secret", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The TOTP secret (also encoded in the QR code). Show this secret\\nin a password-style field to the user, in case they are unable to\\nscan the QR code. Avoid logging this value to the console." - } - }, - { - "name": "uri", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The authenticator URI encoded within the QR code, should you need\\nto use it. Avoid loggin this value to the console." - } - } - ] - }, - "comment": { - "shortText": "TOTP enrollment information." - } - }, - { - "name": "type", - "type": { - "type": "literal", - "value": "totp" - }, - "comment": { - "shortText": "Type of MFA factor." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Starts the enrollment process for a new Multi-Factor Authentication (MFA)\\nfactor. This method creates a new \`unverified\` factor.\\nTo verify a factor, present the QR code or secret to the user and ask them to add it to their\\nauthenticator app.\\nThe user has to enter the code from their authenticator app to verify it.\\n\\nUpon verifying a factor, all other sessions are logged out and the current session's authenticator level is promoted to \`aal2\`." - }, - "altSignatures": [ - { - "params": [ - { - "name": "params", - "type": { - "name": "MFAEnrollPhoneParams", - "type": "object", - "properties": [ - { - "name": "factorType", - "type": { - "type": "literal", - "value": "phone" - }, - "comment": { - "shortText": "The type of factor being enrolled." - } - }, - { - "name": "friendlyName", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Human readable name assigned to the factor." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Phone number associated with a factor. Number should conform to E.164 format" - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAEnrollPhoneResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful for distinguishing between factors *" - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was just enrolled (in an unverified state)." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Phone number of the MFA factor in E.164 format. Used to send messages" - } - }, - { - "name": "type", - "type": { - "type": "literal", - "value": "phone" - }, - "comment": { - "shortText": "Type of MFA factor." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - } - }, - { - "params": [ - { - "name": "params", - "type": { - "type": "union", - "name": "MFAEnrollParams", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "factorType", - "type": { - "type": "literal", - "value": "totp" - }, - "comment": { - "shortText": "The type of factor being enrolled." - } - }, - { - "name": "friendlyName", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Human readable name assigned to the factor." - } - }, - { - "name": "issuer", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Domain which the user is enrolled with." - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "factorType", - "type": { - "type": "literal", - "value": "phone" - }, - "comment": { - "shortText": "The type of factor being enrolled." - } - }, - { - "name": "friendlyName", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Human readable name assigned to the factor." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Phone number associated with a factor. Number should conform to E.164 format" - } - } - ] - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAEnrollResponse", - "subTypes": [ - { - "type": "union", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful for distinguishing between factors *" - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was just enrolled (in an unverified state)." - } - }, - { - "name": "totp", - "type": { - "type": "object", - "properties": [ - { - "name": "qr_code", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Contains a QR code encoding the authenticator URI. You can\\nconvert it to a URL by prepending \`data:image/svg+xml;utf-8,\` to\\nthe value. Avoid logging this value to the console." - } - }, - { - "name": "secret", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The TOTP secret (also encoded in the QR code). Show this secret\\nin a password-style field to the user, in case they are unable to\\nscan the QR code. Avoid logging this value to the console." - } - }, - { - "name": "uri", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "The authenticator URI encoded within the QR code, should you need\\nto use it. Avoid loggin this value to the console." - } - } - ] - }, - "comment": { - "shortText": "TOTP enrollment information." - } - }, - { - "name": "type", - "type": { - "type": "literal", - "value": "totp" - }, - "comment": { - "shortText": "Type of MFA factor." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - }, - { - "type": "union", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful for distinguishing between factors *" - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was just enrolled (in an unverified state)." - } - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Phone number of the MFA factor in E.164 format. Used to send messages" - } - }, - { - "name": "type", - "type": { - "type": "literal", - "value": "phone" - }, - "comment": { - "shortText": "Type of MFA factor." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - ] - } - } - } - } - ] - }, - "@supabase/auth-js.GoTrueMFAApi.getAuthenticatorAssuranceLevel": { - "name": "@supabase/auth-js.GoTrueMFAApi.getAuthenticatorAssuranceLevel", - "params": [], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAGetAuthenticatorAssuranceLevelResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "currentAuthenticationMethods", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "AMREntry", - "properties": [ - { - "name": "method", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "password" - }, - null, - { - "type": "literal", - "value": "otp" - }, - { - "type": "literal", - "value": "oauth" - }, - { - "type": "literal", - "value": "mfa/totp" - } - ] - }, - "comment": { - "shortText": "Authentication method name." - } - }, - { - "name": "timestamp", - "type": { - "type": "intrinsic", - "name": "number" - }, - "comment": { - "shortText": "Timestamp when the method was successfully used. Represents number of\\nseconds since 1st January 1970 (UNIX epoch) in UTC." - } - } - ] - } - }, - "comment": { - "shortText": "A list of all authentication methods attached to this session. Use\\nthe information here to detect the last time a user verified a\\nfactor, for example if implementing a step-up scenario." - } - }, - { - "name": "currentLevel", - "type": { - "type": "union", - "subTypes": [ - { - "type": "union", - "name": "AuthenticatorAssuranceLevels", - "subTypes": [ - { - "type": "literal", - "value": "aal1" - }, - { - "type": "literal", - "value": "aal2" - } - ] - }, - { - "type": "literal", - "value": null - } - ] - }, - "comment": { - "shortText": "Current AAL level of the session." - } - }, - { - "name": "nextLevel", - "type": { - "type": "union", - "subTypes": [ - { - "type": "union", - "name": "AuthenticatorAssuranceLevels", - "subTypes": [ - { - "type": "literal", - "value": "aal1" - }, - { - "type": "literal", - "value": "aal2" - } - ] - }, - { - "type": "literal", - "value": null - } - ] - }, - "comment": { - "shortText": "Next possible AAL level for the session. If the next level is higher\\nthan the current one, the user should go through MFA." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Returns the Authenticator Assurance Level (AAL) for the active session.\\n\\n- \`aal1\` (or \`null\`) means that the user's identity has been verified only\\nwith a conventional login (email+password, OTP, magic link, social login,\\netc.).\\n- \`aal2\` means that the user's identity has been verified both with a conventional login and at least one MFA factor.\\n\\nAlthough this method returns a promise, it's fairly quick (microseconds)\\nand rarely uses the network. You can use this to check whether the current\\nuser needs to be shown a screen to verify their MFA factors." - } - }, - "@supabase/auth-js.GoTrueMFAApi.listFactors": { - "name": "@supabase/auth-js.GoTrueMFAApi.listFactors", - "params": [], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAListFactorsResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "all", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "comment": { - "shortText": "All available factors (verified and unverified)." - } - }, - { - "name": "phone", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "comment": { - "shortText": "Only verified Phone factors. (A subset of \`all\`.)" - } - }, - { - "name": "totp", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "comment": { - "shortText": "Only verified TOTP factors. (A subset of \`all\`.)" - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Returns the list of MFA factors enabled for this user." - } - }, - "@supabase/auth-js.GoTrueMFAApi.unenroll": { - "name": "@supabase/auth-js.GoTrueMFAApi.unenroll", - "params": [ - { - "name": "params", - "type": { - "name": "MFAUnenrollParams", - "type": "object", - "properties": [ - { - "name": "factorId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor being unenrolled." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAUnenrollResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor that was successfully unenrolled." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Unenroll removes a MFA factor.\\nA user has to have an \`aal2\` authenticator level in order to unenroll a \`verified\` factor." - } - }, - "@supabase/auth-js.GoTrueMFAApi.verify": { - "name": "@supabase/auth-js.GoTrueMFAApi.verify", - "params": [ - { - "name": "params", - "type": { - "name": "MFAVerifyParams", - "type": "object", - "properties": [ - { - "name": "challengeId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the challenge being verified. Returned in challenge()." - } - }, - { - "name": "code", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Verification code provided by the user." - } - }, - { - "name": "factorId", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor being verified. Returned in enroll()." - } - } - ] - } - } - ], - "ret": { - "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "name": "AuthMFAVerifyResponse", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "object", - "properties": [ - { - "name": "access_token", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "New access token (JWT) after successful verification." - } - }, - { - "name": "expires_in", - "type": { - "type": "intrinsic", - "name": "number" - }, - "comment": { - "shortText": "Number of seconds in which the access token will expire." - } - }, - { - "name": "refresh_token", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Refresh token you can use to obtain new access tokens when expired." - } - }, - { - "name": "token_type", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "Type of token, typically \`Bearer\`." - } - }, - { - "name": "user", - "type": { - "type": "object", - "name": "User", - "properties": [ - { - "name": "action_link", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "app_metadata", - "type": { - "type": "object", - "name": "UserAppMetadata", - "properties": [ - { - "name": "provider", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - } - ] - } - }, - { - "name": "aud", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "confirmation_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "deleted_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email_change_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "email_confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "factors", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "Factor", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "factor_type", - "type": { - "type": "union", - "subTypes": [ - null, - { - "type": "literal", - "value": "totp" - }, - { - "type": "literal", - "value": "phone" - } - ] - }, - "comment": { - "shortText": "Type of factor. \`totp\` and \`phone\` supported with this version" - } - }, - { - "name": "friendly_name", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true, - "comment": { - "shortText": "Friendly name of the factor, useful to disambiguate between multiple factors." - } - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - }, - "comment": { - "shortText": "ID of the factor." - } - }, - { - "name": "status", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "verified" - }, - { - "type": "literal", - "value": "unverified" - } - ] - }, - "comment": { - "shortText": "Factor's status." - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "isOptional": true - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "identities", - "type": { - "type": "array", - "elemType": { - "type": "object", - "name": "UserIdentity", - "properties": [ - { - "name": "created_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "identity_data", - "type": { - "type": "index signature", - "keyType": { - "type": "intrinsic", - "name": "string" - }, - "valueType": { - "type": "intrinsic", - "name": "any" - } - }, - "isOptional": true - }, - { - "name": "identity_id", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "last_sign_in_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "provider", - "type": { - "type": "intrinsic", - "name": "string" - } - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "user_id", - "type": { - "type": "intrinsic", - "name": "string" - } - } - ] - } - }, - "isOptional": true - }, - { - "name": "invited_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "is_anonymous", - "type": { - "type": "intrinsic", - "name": "boolean" - }, - "isOptional": true - }, - { - "name": "is_sso_user", - "type": { - "type": "intrinsic", - "name": "boolean" - }, - "isOptional": true - }, - { - "name": "last_sign_in_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "new_email", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "new_phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "phone", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "phone_confirmed_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "recovery_sent_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "role", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "updated_at", - "type": { - "type": "intrinsic", - "name": "string" - }, - "isOptional": true - }, - { - "name": "user_metadata", - "type": { - "type": "object", - "name": "UserMetadata", - "properties": [] - } - } - ] - }, - "comment": { - "shortText": "Updated user profile." - } - } - ] - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "AuthError" - } - } - ] - } - ] - } - } - }, - "comment": { - "shortText": "Verifies a code against a challenge. The verification code is\\nprovided by the user by entering a code seen in their authenticator app." - } } } }, @@ -22938,6 +30105,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -23023,7 +30193,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } } }, @@ -23033,7 +30203,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -23046,7 +30216,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -23073,8 +30243,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -23118,7 +30288,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is resolved." + } }, { "name": "onrejected", @@ -23158,7 +30331,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is rejected." + } } ], "ret": { @@ -23166,6 +30342,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "PromiseLike" } + }, + "comment": { + "shortText": "Attaches callbacks for the resolution and/or rejection of the Promise." } }, "@supabase/postgrest-js.PostgrestBuilder.throwOnError": { @@ -23234,10 +30413,13 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } }, "comment": { - "shortText": "Custom fetch" + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "Custom fetch" + } }, { "name": "headers", @@ -23254,7 +30436,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "schema", "type": { "type": "nameOnly", - "name": "SchemaName" + "name": "@supabase/postgrest-js.default.SchemaName" }, "isOptional": true, "comment": { @@ -23271,7 +30453,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "Database" + "name": "PostgrestClient" } }, "comment": { @@ -23286,21 +30468,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "TableName" - }, - "comment": { - "shortText": "The table or view name to query" } } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestQueryBuilder" } }, - "comment": { - "shortText": "Perform a query on a table or a view." - }, "altSignatures": [ { "params": [ @@ -23309,20 +30485,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ViewName" - }, - "comment": { - "shortText": "The table or view name to query" } } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestQueryBuilder" } - }, - "comment": { - "shortText": "Perform a query on a table or a view." } } ] @@ -23411,7 +30581,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, "comment": { @@ -23435,7 +30605,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "Database" + "name": "PostgrestClient" } }, "comment": { @@ -23481,7 +30651,13 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ] } } - ] + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "PostgrestError" + } + } }, "@supabase/postgrest-js.PostgrestFilterBuilder.constructor": { "name": "@supabase/postgrest-js.PostgrestFilterBuilder.constructor", @@ -23538,6 +30714,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -23623,7 +30802,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } } }, @@ -23643,8 +30822,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -23659,9 +30838,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The jsonb, array, or range column to filter on" } }, { @@ -23693,21 +30869,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The jsonb, array, or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for jsonb, array, and range columns. Match only rows where\\nevery element appearing in \`column\` is contained by \`value\`." - }, "altSignatures": [ { "params": [ @@ -23716,9 +30886,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The jsonb, array, or range column to filter on" } }, { @@ -23750,20 +30917,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The jsonb, array, or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for jsonb, array, and range columns. Match only rows where\\nevery element appearing in \`column\` is contained by \`value\`." } } ] @@ -23776,9 +30937,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The jsonb, array, or range column to filter on" } }, { @@ -23810,21 +30968,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The jsonb, array, or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for jsonb, array, and range columns. Match only rows where\\n\`column\` contains every element appearing in \`value\`." - }, "altSignatures": [ { "params": [ @@ -23833,9 +30985,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The jsonb, array, or range column to filter on" } }, { @@ -23867,20 +31016,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The jsonb, array, or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for jsonb, array, and range columns. Match only rows where\\n\`column\` contains every element appearing in \`value\`." } } ] @@ -23891,7 +31034,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -23920,8 +31063,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -24024,11 +31167,11 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "subTypes": [ { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" }, { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } ] } @@ -24045,9 +31188,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24148,9 +31288,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "value": "not.wfts" } ] - }, - "comment": { - "shortText": "The operator to filter with, following PostgREST syntax" } }, { @@ -24158,21 +31295,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with, following PostgREST syntax" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows which satisfy the filter. This is an escape hatch - you\\nshould use the specific filter methods wherever possible.\\n\\nUnlike most filters, \`opearator\` and \`value\` are used as-is and need to\\nfollow [PostgREST\\nsyntax](https://postgrest.org/en/stable/api.html#operators). You also need\\nto make sure they are properly sanitized." - }, "altSignatures": [ { "params": [ @@ -24181,9 +31312,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24191,9 +31319,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The operator to filter with, following PostgREST syntax" } }, { @@ -24201,20 +31326,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with, following PostgREST syntax" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows which satisfy the filter. This is an escape hatch - you\\nshould use the specific filter methods wherever possible.\\n\\nUnlike most filters, \`opearator\` and \`value\` are used as-is and need to\\nfollow [PostgREST\\nsyntax](https://postgrest.org/en/stable/api.html#operators). You also need\\nto make sure they are properly sanitized." } } ] @@ -24225,7 +31344,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -24240,9 +31359,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24250,21 +31366,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row['ColumnName']" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` is greater than \`value\`." - }, "altSignatures": [ { "params": [ @@ -24273,9 +31383,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24283,20 +31390,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` is greater than \`value\`." } } ] @@ -24309,9 +31410,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24319,21 +31417,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row['ColumnName']" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` is greater than or equal to \`value\`." - }, "altSignatures": [ { "params": [ @@ -24342,9 +31434,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24352,20 +31441,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` is greater than or equal to \`value\`." } } ] @@ -24378,9 +31461,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24388,21 +31468,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The pattern to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches \`pattern\` case-insensitively." - }, "altSignatures": [ { "params": [ @@ -24411,9 +31485,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24421,20 +31492,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The pattern to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches \`pattern\` case-insensitively." } } ] @@ -24447,9 +31512,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24460,21 +31522,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches all of \`patterns\` case-insensitively." - }, "altSignatures": [ { "params": [ @@ -24483,9 +31539,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24496,20 +31549,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches all of \`patterns\` case-insensitively." } } ] @@ -24522,9 +31569,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24535,21 +31579,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches any of \`patterns\` case-insensitively." - }, "altSignatures": [ { "params": [ @@ -24558,9 +31596,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24571,20 +31606,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches any of \`patterns\` case-insensitively." } } ] @@ -24614,8 +31643,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -24630,31 +31659,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { - "name": "value", - "type": { - "type": "intrinsic", - "name": "Object" - }, - "comment": { - "shortText": "The value to filter with" - } + "name": "value" } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` IS \`value\`.\\n\\nFor non-boolean columns, this is only relevant for checking if the value of\\n\`column\` is NULL by setting \`value\` to \`null\`.\\n\\nFor boolean columns, you can also set \`value\` to \`true\` or \`false\` and it\\nwill behave the same way as \`.eq()\`." - }, "altSignatures": [ { "params": [ @@ -24663,9 +31679,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24682,20 +31695,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "boolean" } ] - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` IS \`value\`.\\n\\nFor non-boolean columns, this is only relevant for checking if the value of\\n\`column\` is NULL by setting \`value\` to \`null\`.\\n\\nFor boolean columns, you can also set \`value\` to \`true\` or \`false\` and it\\nwill behave the same way as \`.eq()\`." } } ] @@ -24708,9 +31715,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24718,21 +31722,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The pattern to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches \`pattern\` case-sensitively." - }, "altSignatures": [ { "params": [ @@ -24741,9 +31739,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24751,20 +31746,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The pattern to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches \`pattern\` case-sensitively." } } ] @@ -24777,9 +31766,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24790,21 +31776,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches all of \`patterns\` case-sensitively." - }, "altSignatures": [ { "params": [ @@ -24813,9 +31793,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24826,20 +31803,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches all of \`patterns\` case-sensitively." } } ] @@ -24852,9 +31823,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24865,21 +31833,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` matches any of \`patterns\` case-sensitively." - }, "altSignatures": [ { "params": [ @@ -24888,9 +31850,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24901,20 +31860,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" } - }, - "comment": { - "shortText": "The patterns to match with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` matches any of \`patterns\` case-sensitively." } } ] @@ -24968,8 +31921,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -24984,9 +31937,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -24994,21 +31944,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row['ColumnName']" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` is less than \`value\`." - }, "altSignatures": [ { "params": [ @@ -25017,9 +31961,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -25027,20 +31968,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` is less than \`value\`." } } ] @@ -25053,9 +31988,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -25063,21 +31995,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row['ColumnName']" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where \`column\` is less than or equal to \`value\`." - }, "altSignatures": [ { "params": [ @@ -25086,9 +32012,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -25096,20 +32019,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where \`column\` is less than or equal to \`value\`." } } ] @@ -25130,21 +32047,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "Row['ColumnName']" } - }, - "comment": { - "shortText": "The object to filter with, with column names as keys mapped\\nto their filter values" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows where each column in \`query\` keys is equal to its\\nassociated value. Shorthand for multiple \`.eq()\`s." - }, "altSignatures": [ { "params": [ @@ -25161,20 +32072,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "unknown" } - }, - "comment": { - "shortText": "The object to filter with, with column names as keys mapped\\nto their filter values" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows where each column in \`query\` keys is equal to its\\nassociated value. Shorthand for multiple \`.eq()\`s." } } ] @@ -25203,7 +32108,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -25232,8 +32137,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -25248,9 +32153,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -25258,9 +32160,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "FilterOperator" - }, - "comment": { - "shortText": "The operator to be negated to filter with, following\\nPostgREST syntax" } }, { @@ -25268,21 +32167,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row['ColumnName']" - }, - "comment": { - "shortText": "The value to filter with, following PostgREST syntax" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Match only rows which doesn't satisfy the filter.\\n\\nUnlike most filters, \`opearator\` and \`value\` are used as-is and need to\\nfollow [PostgREST\\nsyntax](https://postgrest.org/en/stable/api.html#operators). You also need\\nto make sure they are properly sanitized." - }, "altSignatures": [ { "params": [ @@ -25291,9 +32184,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to filter on" } }, { @@ -25301,9 +32191,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The operator to be negated to filter with, following\\nPostgREST syntax" } }, { @@ -25311,20 +32198,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "unknown" - }, - "comment": { - "shortText": "The value to filter with, following PostgREST syntax" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Match only rows which doesn't satisfy the filter.\\n\\nUnlike most filters, \`opearator\` and \`value\` are used as-is and need to\\nfollow [PostgREST\\nsyntax](https://postgrest.org/en/stable/api.html#operators). You also need\\nto make sure they are properly sanitized." } } ] @@ -25378,8 +32259,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -25394,9 +32275,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to order by" } }, { @@ -25410,10 +32288,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, the result will be in ascending order" - } + "isOptional": true }, { "name": "nullsFirst", @@ -25421,10 +32296,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, \`null\`s appear first. If \`false\`,\\n\`null\`s appear last." - } + "isOptional": true }, { "name": "referencedTable", @@ -25432,28 +32304,19 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "undefined" }, - "isOptional": true, - "comment": { - "shortText": "Set this to order a referenced table by\\nits columns" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Order the query result by \`column\`.\\n\\nYou can call this method multiple times to order by multiple columns.\\n\\nYou can order referenced tables, but it only affects the ordering of the\\nparent table if you use \`!inner\` in the query." - }, "altSignatures": [ { "params": [ @@ -25462,9 +32325,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to order by" } }, { @@ -25478,10 +32338,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, the result will be in ascending order" - } + "isOptional": true }, { "name": "nullsFirst", @@ -25489,10 +32346,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, \`null\`s appear first. If \`false\`,\\n\`null\`s appear last." - } + "isOptional": true }, { "name": "referencedTable", @@ -25500,27 +32354,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "Set this to order a referenced table by\\nits columns" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Order the query result by \`column\`.\\n\\nYou can call this method multiple times to order by multiple columns.\\n\\nYou can order referenced tables, but it only affects the ordering of the\\nparent table if you use \`!inner\` in the query." } }, { @@ -25568,8 +32413,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -25621,8 +32466,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -25639,9 +32484,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The array or range column to filter on" } }, { @@ -25661,21 +32503,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The array or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for array and range columns. Match only rows where\\n\`column\` and \`value\` have an element in common." - }, "altSignatures": [ { "params": [ @@ -25684,9 +32520,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The array or range column to filter on" } }, { @@ -25706,20 +32539,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ] - }, - "comment": { - "shortText": "The array or range value to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for array and range columns. Match only rows where\\n\`column\` and \`value\` have an element in common." } } ] @@ -25730,7 +32557,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -25796,8 +32623,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -25812,9 +32639,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25822,21 +32646,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where \`column\` is\\nmutually exclusive to \`range\` and there can be no element between the two\\nranges." - }, "altSignatures": [ { "params": [ @@ -25845,9 +32663,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25855,20 +32670,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where \`column\` is\\nmutually exclusive to \`range\` and there can be no element between the two\\nranges." } } ] @@ -25881,9 +32690,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25891,21 +32697,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is greater than any element in \`range\`." - }, "altSignatures": [ { "params": [ @@ -25914,9 +32714,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25924,20 +32721,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is greater than any element in \`range\`." } } ] @@ -25950,9 +32741,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25960,21 +32748,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is either contained in \`range\` or greater than any element in\\n\`range\`." - }, "altSignatures": [ { "params": [ @@ -25983,9 +32765,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -25993,20 +32772,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is either contained in \`range\` or greater than any element in\\n\`range\`." } } ] @@ -26019,9 +32792,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -26029,21 +32799,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is less than any element in \`range\`." - }, "altSignatures": [ { "params": [ @@ -26052,9 +32816,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -26062,20 +32823,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is less than any element in \`range\`." } } ] @@ -26088,9 +32843,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -26098,21 +32850,15 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is either contained in \`range\` or less than any element in\\n\`range\`." - }, "altSignatures": [ { "params": [ @@ -26121,9 +32867,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range column to filter on" } }, { @@ -26131,20 +32874,14 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The range to filter with" } } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for range columns. Match only rows where every element in\\n\`column\` is either contained in \`range\` or less than any element in\\n\`range\`." } } ] @@ -26155,7 +32892,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestTransformBuilder" } }, "comment": { @@ -26167,8 +32904,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "params": [], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -26193,7 +32930,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestTransformBuilder" } }, "comment": { @@ -26220,8 +32957,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -26234,7 +32971,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -26249,9 +32986,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The text or tsvector column to filter on" } }, { @@ -26259,9 +32993,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The query text to match with" } }, { @@ -26275,10 +33006,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "The text search configuration to use" - } + "isOptional": true }, { "name": "type", @@ -26299,28 +33027,19 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Change how the \`query\` text is interpreted" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Only relevant for text and tsvector columns. Match only rows where\\n\`column\` matches the query string in \`query\`." - }, "altSignatures": [ { "params": [ @@ -26329,9 +33048,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The text or tsvector column to filter on" } }, { @@ -26339,9 +33055,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The query text to match with" } }, { @@ -26355,10 +33068,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "The text search configuration to use" - } + "isOptional": true }, { "name": "type", @@ -26379,27 +33089,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Change how the \`query\` text is interpreted" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Only relevant for text and tsvector columns. Match only rows where\\n\`column\` matches the query string in \`query\`." } } ] @@ -26449,7 +33150,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "data", "type": { "type": "nameOnly", - "name": "T" + "name": "@supabase/postgrest-js.PostgrestResponseSuccess.T" } }, { @@ -26494,7 +33195,11 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } }, { - "name": "error" + "name": "error", + "type": { + "type": "nameOnly", + "name": "PostgrestError" + } }, { "name": "status", @@ -26534,7 +33239,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is resolved." + } }, { "name": "onrejected", @@ -26574,7 +33282,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is rejected." + } } ], "ret": { @@ -26582,6 +33293,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "PromiseLike" } + }, + "comment": { + "shortText": "Attaches callbacks for the resolution and/or rejection of the Promise." } }, "@supabase/postgrest-js.PostgrestFilterBuilder.throwOnError": { @@ -26644,6 +33358,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -26671,7 +33388,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestQueryBuilder" } } }, @@ -26717,7 +33434,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, "comment": { @@ -26732,9 +33449,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row" - }, - "comment": { - "shortText": "The values to insert. Pass an object to insert a single row\\nor an array to insert multiple rows." } }, { @@ -26761,28 +33475,19 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Count algorithm to use to count inserted rows.\\n\\n\`\\"exact\\"\`: Exact but slow count algorithm. Performs a \`COUNT(*)\` under the\\nhood.\\n\\n\`\\"planned\\"\`: Approximated but fast count algorithm. Uses the Postgres\\nstatistics under the hood.\\n\\n\`\\"estimated\\"\`: Uses exact count for low numbers and planned count for high\\nnumbers." - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, - "comment": { - "shortText": "Perform an INSERT into the table or view.\\n\\nBy default, inserted rows are not returned. To return it, chain the call\\nwith \`.select()\`." - }, "altSignatures": [ { "params": [ @@ -26794,9 +33499,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "Row" } - }, - "comment": { - "shortText": "The values to insert. Pass an object to insert a single row\\nor an array to insert multiple rows." } }, { @@ -26823,10 +33525,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Count algorithm to use to count inserted rows.\\n\\n\`\\"exact\\"\`: Exact but slow count algorithm. Performs a \`COUNT(*)\` under the\\nhood.\\n\\n\`\\"planned\\"\`: Approximated but fast count algorithm. Uses the Postgres\\nstatistics under the hood.\\n\\n\`\\"estimated\\"\`: Uses exact count for low numbers and planned count for high\\nnumbers." - } + "isOptional": true }, { "name": "defaultToNull", @@ -26834,27 +33533,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "Make missing fields default to \`null\`.\\nOtherwise, use the default value for the column. Only applies for bulk\\ninserts." - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } - }, - "comment": { - "shortText": "Perform an INSERT into the table or view.\\n\\nBy default, inserted rows are not returned. To return it, chain the call\\nwith \`.select()\`." } } ] @@ -26923,7 +33613,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, "comment": { @@ -26982,7 +33672,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, "comment": { @@ -26997,9 +33687,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "Row" - }, - "comment": { - "shortText": "The values to upsert with. Pass an object to upsert a\\nsingle row or an array to upsert multiple rows." } }, { @@ -27026,10 +33713,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Count algorithm to use to count upserted rows.\\n\\n\`\\"exact\\"\`: Exact but slow count algorithm. Performs a \`COUNT(*)\` under the\\nhood.\\n\\n\`\\"planned\\"\`: Approximated but fast count algorithm. Uses the Postgres\\nstatistics under the hood.\\n\\n\`\\"estimated\\"\`: Uses exact count for low numbers and planned count for high\\nnumbers." - } + "isOptional": true }, { "name": "ignoreDuplicates", @@ -27037,10 +33721,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, duplicate rows are ignored. If\\n\`false\`, duplicate rows are merged with existing rows." - } + "isOptional": true }, { "name": "onConflict", @@ -27048,28 +33729,19 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "Comma-separated UNIQUE column(s) to specify how\\nduplicate rows are determined. Two rows are duplicates if all the\\n\`onConflict\` columns are equal." - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } }, - "comment": { - "shortText": "Perform an UPSERT on the table or view. Depending on the column(s) passed\\nto \`onConflict\`, \`.upsert()\` allows you to perform the equivalent of\\n\`.insert()\` if a row with the corresponding \`onConflict\` columns doesn't\\nexist, or if it does exist, perform an alternative action depending on\\n\`ignoreDuplicates\`.\\n\\nBy default, upserted rows are not returned. To return it, chain the call\\nwith \`.select()\`." - }, "altSignatures": [ { "params": [ @@ -27081,9 +33753,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "Row" } - }, - "comment": { - "shortText": "The values to upsert with. Pass an object to upsert a\\nsingle row or an array to upsert multiple rows." } }, { @@ -27110,10 +33779,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true, - "comment": { - "shortText": "Count algorithm to use to count upserted rows.\\n\\n\`\\"exact\\"\`: Exact but slow count algorithm. Performs a \`COUNT(*)\` under the\\nhood.\\n\\n\`\\"planned\\"\`: Approximated but fast count algorithm. Uses the Postgres\\nstatistics under the hood.\\n\\n\`\\"estimated\\"\`: Uses exact count for low numbers and planned count for high\\nnumbers." - } + "isOptional": true }, { "name": "defaultToNull", @@ -27121,10 +33787,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "Make missing fields default to \`null\`.\\nOtherwise, use the default value for the column. This only applies when\\ninserting new rows, not when merging with existing rows under\\n\`ignoreDuplicates: false\`. This also only applies when doing bulk upserts." - } + "isOptional": true }, { "name": "ignoreDuplicates", @@ -27132,10 +33795,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, duplicate rows are ignored. If\\n\`false\`, duplicate rows are merged with existing rows." - } + "isOptional": true }, { "name": "onConflict", @@ -27143,27 +33803,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "Comma-separated UNIQUE column(s) to specify how\\nduplicate rows are determined. Two rows are duplicates if all the\\n\`onConflict\` columns are equal." - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestFilterBuilder" } - }, - "comment": { - "shortText": "Perform an UPSERT on the table or view. Depending on the column(s) passed\\nto \`onConflict\`, \`.upsert()\` allows you to perform the equivalent of\\n\`.insert()\` if a row with the corresponding \`onConflict\` columns doesn't\\nexist, or if it does exist, perform an alternative action depending on\\n\`ignoreDuplicates\`.\\n\\nBy default, upserted rows are not returned. To return it, chain the call\\nwith \`.select()\`." } } ] @@ -27223,6 +33874,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -27308,7 +33962,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestTransformBuilder" } } }, @@ -27328,8 +33982,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27342,7 +33996,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -27445,11 +34099,11 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "subTypes": [ { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" }, { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } ] } @@ -27464,7 +34118,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -27520,8 +34174,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27552,7 +34206,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -27567,9 +34221,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "nameOnly", "name": "ColumnName" - }, - "comment": { - "shortText": "The column to order by" } }, { @@ -27583,10 +34234,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, the result will be in ascending order" - } + "isOptional": true }, { "name": "nullsFirst", @@ -27594,10 +34242,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, \`null\`s appear first. If \`false\`,\\n\`null\`s appear last." - } + "isOptional": true }, { "name": "referencedTable", @@ -27605,28 +34250,19 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "undefined" }, - "isOptional": true, - "comment": { - "shortText": "Set this to order a referenced table by\\nits columns" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, - "comment": { - "shortText": "Order the query result by \`column\`.\\n\\nYou can call this method multiple times to order by multiple columns.\\n\\nYou can order referenced tables, but it only affects the ordering of the\\nparent table if you use \`!inner\` in the query." - }, "altSignatures": [ { "params": [ @@ -27635,9 +34271,6 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": { "type": "intrinsic", "name": "string" - }, - "comment": { - "shortText": "The column to order by" } }, { @@ -27651,10 +34284,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, the result will be in ascending order" - } + "isOptional": true }, { "name": "nullsFirst", @@ -27662,10 +34292,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "boolean" }, - "isOptional": true, - "comment": { - "shortText": "If \`true\`, \`null\`s appear first. If \`false\`,\\n\`null\`s appear last." - } + "isOptional": true }, { "name": "referencedTable", @@ -27673,27 +34300,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "intrinsic", "name": "string" }, - "isOptional": true, - "comment": { - "shortText": "Set this to order a referenced table by\\nits columns" - } + "isOptional": true } ] }, - "isOptional": true, - "comment": { - "shortText": "Named parameters" - } + "isOptional": true } ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } - }, - "comment": { - "shortText": "Order the query result by \`column\`.\\n\\nYou can call this method multiple times to order by multiple columns.\\n\\nYou can order referenced tables, but it only affects the ordering of the\\nparent table if you use \`!inner\` in the query." } }, { @@ -27741,8 +34359,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27794,8 +34412,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27810,7 +34428,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -27876,8 +34494,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27890,7 +34508,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestTransformBuilder" } }, "comment": { @@ -27902,8 +34520,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "params": [], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27928,7 +34546,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestTransformBuilder" } }, "comment": { @@ -27955,8 +34573,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` ], "ret": { "type": { - "type": "nameOnly", - "name": "ClientOptions" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -27969,7 +34587,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "ret": { "type": { "type": "nameOnly", - "name": "ClientOptions" + "name": "PostgrestBuilder" } }, "comment": { @@ -28021,7 +34639,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "data", "type": { "type": "nameOnly", - "name": "T" + "name": "@supabase/postgrest-js.PostgrestResponseSuccess.T" } }, { @@ -28066,7 +34684,11 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } }, { - "name": "error" + "name": "error", + "type": { + "type": "nameOnly", + "name": "PostgrestError" + } }, { "name": "status", @@ -28106,7 +34728,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is resolved." + } }, { "name": "onrejected", @@ -28146,7 +34771,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } ] }, - "isOptional": true + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is rejected." + } } ], "ret": { @@ -28154,6 +34782,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "nameOnly", "name": "PromiseLike" } + }, + "comment": { + "shortText": "Attaches callbacks for the resolution and/or rejection of the Promise." } }, "@supabase/postgrest-js.PostgrestTransformBuilder.throwOnError": { @@ -28523,7 +35154,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "event", "type": { - "type": "nameOnly", + "type": "literal", + "value": "*", "name": "T" }, "comment": { @@ -28629,7 +35261,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "event", "type": { - "type": "nameOnly", + "type": "literal", + "value": "INSERT", "name": "T" }, "comment": { @@ -28721,7 +35354,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "event", "type": { - "type": "nameOnly", + "type": "literal", + "value": "UPDATE", "name": "T" }, "comment": { @@ -28813,7 +35447,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "event", "type": { - "type": "nameOnly", + "type": "literal", + "value": "DELETE", "name": "T" }, "comment": { @@ -30663,8 +37298,17 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "input", "type": { - "type": "nameOnly", - "name": "RequestInfo" + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "RequestInfo" + }, + { + "type": "nameOnly", + "name": "URL" + } + ] } }, { @@ -30685,6 +37329,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -30692,8 +37339,18 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "opts", "type": { - "type": "nameOnly", - "name": "StorageClientOptions" + "type": "object", + "name": "StorageClientOptions", + "properties": [ + { + "name": "useNewHostname", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + } + ] }, "isOptional": true } @@ -30816,14 +37473,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "object", "properties": [ { - "name": "data", - "type": { - "name": "name", - "type": { - "type": "intrinsic", - "name": "string" - } - } + "name": "data" }, { "name": "error", @@ -31025,6 +37675,12 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } ], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + }, "comment": { "shortText": "Perform file operation in a bucket." } @@ -31322,8 +37978,8 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "params": [], "ret": { "type": { - "type": "nameOnly", - "name": "StorageClient" + "type": "intrinsic", + "name": "this" } }, "comment": { @@ -31513,6 +38169,204 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` } } }, + "@supabase/storage-js.packages/BlobDownloadBuilder.default.constructor": { + "name": "@supabase/storage-js.packages/BlobDownloadBuilder.default.constructor", + "params": [ + { + "name": "downloadFn", + "type": { + "type": "function", + "params": [], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "nameOnly", + "name": "Response" + } + } + } + } + }, + { + "name": "shouldThrowOnError", + "type": { + "type": "intrinsic", + "name": "boolean" + } + } + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + } + }, + "@supabase/storage-js.packages/BlobDownloadBuilder.default.asStream": { + "name": "@supabase/storage-js.packages/BlobDownloadBuilder.default.asStream", + "params": [], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + } + }, + "@supabase/storage-js.packages/BlobDownloadBuilder.default.then": { + "name": "@supabase/storage-js.packages/BlobDownloadBuilder.default.then", + "params": [ + { + "name": "onfulfilled", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "value", + "type": { + "type": "union", + "name": "DownloadResult", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "StorageError" + } + } + ] + } + ] + } + } + ], + "ret": { + "type": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult1" + }, + { + "type": "nameOnly", + "name": "PromiseLike" + } + ] + } + } + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is resolved." + } + }, + { + "name": "onrejected", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "reason", + "type": { + "type": "intrinsic", + "name": "any" + } + } + ], + "ret": { + "type": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult2" + }, + { + "type": "nameOnly", + "name": "PromiseLike" + } + ] + } + } + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is rejected." + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult1" + }, + { + "type": "nameOnly", + "name": "TResult2" + } + ] + } + } + }, + "comment": { + "shortText": "Attaches callbacks for the resolution and/or rejection of the Promise." + } + }, "@supabase/storage-js.packages/StorageBucketApi.default.constructor": { "name": "@supabase/storage-js.packages/StorageBucketApi.default.constructor", "params": [ @@ -31545,8 +38399,17 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "input", "type": { - "type": "nameOnly", - "name": "RequestInfo" + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "RequestInfo" + }, + { + "type": "nameOnly", + "name": "URL" + } + ] } }, { @@ -31567,6 +38430,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -31574,12 +38440,28 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "opts", "type": { - "type": "nameOnly", - "name": "StorageClientOptions" + "type": "object", + "name": "StorageClientOptions", + "properties": [ + { + "name": "useNewHostname", + "type": { + "type": "intrinsic", + "name": "boolean" + }, + "isOptional": true + } + ] }, "isOptional": true } - ] + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + } }, "@supabase/storage-js.packages/StorageBucketApi.default.createBucket": { "name": "@supabase/storage-js.packages/StorageBucketApi.default.createBucket", @@ -31692,14 +38574,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "type": "object", "properties": [ { - "name": "data", - "type": { - "name": "name", - "type": { - "type": "intrinsic", - "name": "string" - } - } + "name": "data" }, { "name": "error", @@ -32178,6 +39053,12 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "@supabase/storage-js.packages/StorageBucketApi.default.throwOnError": { "name": "@supabase/storage-js.packages/StorageBucketApi.default.throwOnError", "params": [], + "ret": { + "type": { + "type": "intrinsic", + "name": "this" + } + }, "comment": { "shortText": "Enable throwing errors instead of returning them." } @@ -32362,8 +39243,17 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "input", "type": { - "type": "nameOnly", - "name": "RequestInfo" + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "RequestInfo" + }, + { + "type": "nameOnly", + "name": "URL" + } + ] } }, { @@ -32384,11 +39274,20 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true } - ] + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + } }, "@supabase/storage-js.packages/StorageFileApi.default.copy": { "name": "@supabase/storage-js.packages/StorageFileApi.default.copy", @@ -32698,7 +39597,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "subTypes": [ { "type": "literal", - "value": "cover" + "value": "fill" }, { "type": "literal", @@ -32706,7 +39605,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "literal", - "value": "fill" + "value": "cover" } ] }, @@ -32966,141 +39865,16 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` { "name": "options", "type": { - "type": "object", - "properties": [ - { - "name": "transform", - "type": { - "type": "object", - "name": "TransformOptions", - "properties": [ - { - "name": "format", - "type": { - "type": "literal", - "value": "origin" - }, - "isOptional": true, - "comment": { - "shortText": "Specify the format of the image requested.\\n\\nWhen using 'origin' we force the format to be the same as the original image.\\nWhen this option is not passed in, images are optimized to modern image formats like Webp." - } - }, - { - "name": "height", - "type": { - "type": "intrinsic", - "name": "number" - }, - "isOptional": true, - "comment": { - "shortText": "The height of the image in pixels." - } - }, - { - "name": "quality", - "type": { - "type": "intrinsic", - "name": "number" - }, - "isOptional": true, - "comment": { - "shortText": "Set the quality of the returned image.\\nA number from 20 to 100, with 100 being the highest quality.\\nDefaults to 80" - } - }, - { - "name": "resize", - "type": { - "type": "union", - "subTypes": [ - { - "type": "literal", - "value": "cover" - }, - { - "type": "literal", - "value": "contain" - }, - { - "type": "literal", - "value": "fill" - } - ] - }, - "isOptional": true, - "comment": { - "shortText": "The resize mode can be cover, contain or fill. Defaults to cover.\\nCover resizes the image to maintain it's aspect ratio while filling the entire width and height.\\nContain resizes the image to maintain it's aspect ratio while fitting the entire image within the width and height.\\nFill resizes the image to fill the entire width and height. If the object's aspect ratio does not match the width and height, the image will be stretched to fit." - } - }, - { - "name": "width", - "type": { - "type": "intrinsic", - "name": "number" - }, - "isOptional": true, - "comment": { - "shortText": "The width of the image in pixels." - } - } - ] - }, - "isOptional": true, - "comment": { - "shortText": "Transform the asset before serving it to the client." - } - } - ] + "type": "nameOnly", + "name": "Options" }, "isOptional": true } ], "ret": { "type": { - "type": "promise", - "name": "Promise", - "awaited": { - "type": "union", - "subTypes": [ - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "nameOnly", - "name": "Blob" - } - }, - { - "name": "error", - "type": { - "type": "literal", - "value": null - } - } - ] - }, - { - "type": "object", - "properties": [ - { - "name": "data", - "type": { - "type": "literal", - "value": null - } - }, - { - "name": "error", - "type": { - "type": "nameOnly", - "name": "StorageError" - } - } - ] - } - ] - } + "type": "nameOnly", + "name": "default" } }, "comment": { @@ -33255,7 +40029,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "subTypes": [ { "type": "literal", - "value": "cover" + "value": "fill" }, { "type": "literal", @@ -33263,7 +40037,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "literal", - "value": "fill" + "value": "cover" } ] }, @@ -34362,6 +41136,12 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "@supabase/storage-js.packages/StorageFileApi.default.throwOnError": { "name": "@supabase/storage-js.packages/StorageFileApi.default.throwOnError", "params": [], + "ret": { + "type": { + "type": "intrinsic", + "name": "this" + } + }, "comment": { "shortText": "Enable throwing errors instead of returning them." } @@ -34420,7 +41200,11 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "nameOnly", - "name": "@types/node.Buffer" + "name": "FormData" + }, + { + "type": "nameOnly", + "name": "URLSearchParams" }, { "type": "nameOnly", @@ -34428,7 +41212,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "nameOnly", - "name": "FormData" + "name": "ReadableStream" }, { "type": "nameOnly", @@ -34436,11 +41220,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "type": "nameOnly", - "name": "ReadableStream" - }, - { - "type": "nameOnly", - "name": "URLSearchParams" + "name": "@types/node.__global.Buffer" } ] }, @@ -35000,6 +41780,194 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "comment": { "shortText": "Upload a file with a token generated from \`createSignedUploadUrl\`." } + }, + "@supabase/storage-js.packages/StreamDownloadBuilder.default.constructor": { + "name": "@supabase/storage-js.packages/StreamDownloadBuilder.default.constructor", + "params": [ + { + "name": "downloadFn", + "type": { + "type": "function", + "params": [], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "nameOnly", + "name": "Response" + } + } + } + } + }, + { + "name": "shouldThrowOnError", + "type": { + "type": "intrinsic", + "name": "boolean" + } + } + ], + "ret": { + "type": { + "type": "nameOnly", + "name": "default" + } + } + }, + "@supabase/storage-js.packages/StreamDownloadBuilder.default.then": { + "name": "@supabase/storage-js.packages/StreamDownloadBuilder.default.then", + "params": [ + { + "name": "onfulfilled", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "value", + "type": { + "type": "union", + "name": "DownloadResult", + "subTypes": [ + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "nameOnly", + "name": "T" + } + }, + { + "name": "error", + "type": { + "type": "literal", + "value": null + } + } + ] + }, + { + "type": "object", + "properties": [ + { + "name": "data", + "type": { + "type": "literal", + "value": null + } + }, + { + "name": "error", + "type": { + "type": "nameOnly", + "name": "StorageError" + } + } + ] + } + ] + } + } + ], + "ret": { + "type": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult1" + }, + { + "type": "nameOnly", + "name": "PromiseLike" + } + ] + } + } + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is resolved." + } + }, + { + "name": "onrejected", + "type": { + "type": "union", + "subTypes": [ + { + "type": "literal", + "value": null + }, + { + "type": "function", + "params": [ + { + "name": "reason", + "type": { + "type": "intrinsic", + "name": "any" + } + } + ], + "ret": { + "type": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult2" + }, + { + "type": "nameOnly", + "name": "PromiseLike" + } + ] + } + } + } + ] + }, + "isOptional": true, + "comment": { + "shortText": "The callback to execute when the Promise is rejected." + } + } + ], + "ret": { + "type": { + "type": "promise", + "name": "Promise", + "awaited": { + "type": "union", + "subTypes": [ + { + "type": "nameOnly", + "name": "TResult1" + }, + { + "type": "nameOnly", + "name": "TResult2" + } + ] + } + } + }, + "comment": { + "shortText": "Attaches callbacks for the resolution and/or rejection of the Promise." + } } } }, @@ -35059,6 +42027,9 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "Response" } } + }, + "comment": { + "shortText": "[MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch)" } }, "isOptional": true @@ -35081,6 +42052,10 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "region", + "type": { + "type": "nameOnly", + "name": "FunctionRegion" + }, "isOptional": true } ] @@ -35213,15 +42188,30 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` }, { "name": "region", + "type": { + "type": "nameOnly", + "name": "FunctionRegion" + }, "isOptional": true, "comment": { "shortText": "The Region to invoke the function in." } + }, + { + "name": "signal", + "type": { + "type": "nameOnly", + "name": "AbortSignal" + }, + "isOptional": true, + "comment": { + "shortText": "The AbortSignal to use for the request." + } } ] }, "comment": { - "shortText": "Options for invoking the Function.\\n" + "shortText": "Options for invoking the Function." } } ], @@ -35232,7 +42222,16 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "awaited": { "type": "union", "name": "FunctionsResponse", - "subTypes": [] + "subTypes": [ + { + "type": "nameOnly", + "name": "FunctionsResponseSuccess" + }, + { + "type": "nameOnly", + "name": "FunctionsResponseFailure" + } + ] } } }, @@ -35250,7 +42249,7 @@ exports[`TS type spec parsing > matches snapshot 1`] = ` "name": "string" }, "comment": { - "shortText": "the new jwt token sent in the authorisation header\\n" + "shortText": "the new jwt token sent in the authorisation header" } } ], diff --git a/apps/docs/features/ui/McpConfigPanel.tsx b/apps/docs/features/ui/McpConfigPanel.tsx index 96411cd9299..be86b5261d5 100644 --- a/apps/docs/features/ui/McpConfigPanel.tsx +++ b/apps/docs/features/ui/McpConfigPanel.tsx @@ -18,6 +18,7 @@ import { PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, } from 'ui' +import { Admonition } from 'ui-patterns' import { McpConfigPanel as McpConfigPanelBase } from 'ui-patterns/McpUrlBuilder' import { useProjectsQuery } from '~/lib/fetch/projects' @@ -193,28 +194,44 @@ export function McpConfigPanel() { const project = isPlatform ? selectedProject : null return ( -
-
- +
+
+ + {isPlatform && ( + + )} +
+

+ {isPlatform + ? 'Scope the MCP server to a project. If no project is selected, all projects will be accessible.' + : 'Project selection is only available for the hosted platform.'} +

+ - {isPlatform && ( - - )}
-

- {isPlatform - ? 'Scope the MCP server to a project. If no project is selected, all projects will be accessible.' - : 'Project selection is only available for the hosted platform.'} -

- -
+ {isPlatform && ( + +

+ { + "Your MCP client will automatically prompt you to login to Supabase during setup. This will open a browser window where you can login to your Supabase account and grant access to the MCP client. Be sure to choose the organization that contains the project you wish to work with. In the future, we'll offer more fine grain control over these permissions." + } +

+

+ { + 'Previously Supabase MCP required you to generate a personal access token (PAT), but this is no longer required.' + } +

+
+ )} + ) } diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index dc97d192858..08392a4c0a0 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -3,6 +3,7 @@ TEAM Supabase is 100% remote. Aaron Byrne +Adam Mokan Alaister Young Alan De Los Santos Aleksi Immonen @@ -44,6 +45,7 @@ Deji I Div Arora Divit D Douglas Hunley +Dustin Keib Eduardo Gurgel Egor Romanov Eleftheria Trivyzaki diff --git a/apps/docs/spec/Makefile b/apps/docs/spec/Makefile index 73f5b2dadcc..aeb4daa1a1d 100644 --- a/apps/docs/spec/Makefile +++ b/apps/docs/spec/Makefile @@ -37,12 +37,12 @@ download.storage.v1: # curl -sS https://supabase.github.io/functions-js/v1/spec.json > $(REPO_DIR)/enrichments/tsdoc_v1/functions.json download.tsdoc.v2: - curl -sS https://supabase.github.io/supabase-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/supabase.json - curl -sS https://supabase.github.io/auth-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/gotrue.json - curl -sS https://supabase.github.io/postgrest-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/postgrest.json - curl -sS https://supabase.github.io/realtime-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/realtime.json - curl -sS https://supabase.github.io/storage-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/storage.json - curl -sS https://supabase.github.io/functions-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/functions.json + curl -sS https://supabase.github.io/supabase-js/supabase-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/supabase.json + curl -sS https://supabase.github.io/supabase-js/auth-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/gotrue.json + curl -sS https://supabase.github.io/supabase-js/postgrest-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/postgrest.json + curl -sS https://supabase.github.io/supabase-js/realtime-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/realtime.json + curl -sS https://supabase.github.io/supabase-js/storage-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/storage.json + curl -sS https://supabase.github.io/supabase-js/functions-js/v2/spec.json > $(REPO_DIR)/enrichments/tsdoc_v2/functions.json download.analytics.v0: curl -sS https://logflare.app/api/openapi > $(REPO_DIR)/analytics_v0_openapi.json diff --git a/apps/docs/spec/api_v1_openapi.json b/apps/docs/spec/api_v1_openapi.json index 36e0d4f4a64..ae8545f21dc 100644 --- a/apps/docs/spec/api_v1_openapi.json +++ b/apps/docs/spec/api_v1_openapi.json @@ -633,6 +633,198 @@ "tags": ["Database"] } }, + "/v1/projects/{ref}/actions": { + "get": { + "description": "Returns a paginated list of action runs of the specified project.", + "operationId": "v1-list-action-runs", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } + }, + { + "name": "offset", + "required": false, + "in": "query", + "schema": { "minimum": 0, "type": "number" } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { "minimum": 10, "type": "number" } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ListActionRunResponse" } + } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to list action runs" } + }, + "security": [{ "bearer": [] }], + "summary": "List all action runs", + "tags": ["Environments"] + }, + "head": { + "description": "Returns the total number of action runs of the specified project.", + "operationId": "v1-count-action-runs", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } + } + ], + "responses": { + "200": { + "headers": { + "X-Total-Count": { + "schema": { "type": "integer", "format": "int64", "minimum": 0 }, + "description": "total count value" + } + }, + "description": "" + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to count action runs" } + }, + "security": [{ "bearer": [] }], + "summary": "Count the number of action runs", + "tags": ["Environments"] + } + }, + "/v1/projects/{ref}/actions/{run_id}": { + "get": { + "description": "Returns the current status of the specified action run.", + "operationId": "v1-get-action-run", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } + }, + { + "name": "run_id", + "required": true, + "in": "path", + "description": "Action Run ID", + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/ActionRunResponse" } } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to get action run status" } + }, + "security": [{ "bearer": [] }], + "summary": "Get the status of an action run", + "tags": ["Environments"] + } + }, + "/v1/projects/{ref}/actions/{run_id}/status": { + "patch": { + "description": "Updates the status of an ongoing action run.", + "operationId": "v1-update-action-run-status", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } + }, + { + "name": "run_id", + "required": true, + "in": "path", + "description": "Action Run ID", + "schema": { "type": "string" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/UpdateRunStatusBody" } } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UpdateRunStatusResponse" } + } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to update action run status" } + }, + "security": [{ "bearer": [] }], + "summary": "Update the status of an action run", + "tags": ["Environments"] + } + }, + "/v1/projects/{ref}/actions/{run_id}/logs": { + "get": { + "description": "Returns the logs from the specified action run.", + "operationId": "v1-get-action-run-logs", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } + }, + { + "name": "run_id", + "required": true, + "in": "path", + "description": "Action Run ID", + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "content": { "text/plain": { "schema": { "type": "string" } } }, + "description": "" + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to get action run logs" } + }, + "security": [{ "bearer": [] }], + "summary": "Get the logs of an action run", + "tags": ["Environments"] + } + }, "/v1/projects/{ref}/api-keys": { "get": { "operationId": "v1-get-project-api-keys", @@ -664,7 +856,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Get project api keys", @@ -701,7 +895,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Creates a new API key for the project", @@ -729,7 +925,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found.", @@ -762,7 +960,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found.", @@ -807,7 +1007,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Updates an API key for the project", @@ -844,7 +1046,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Get API key", @@ -889,7 +1093,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Deletes an API key for the project", @@ -921,7 +1127,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve database branches" } }, "security": [{ "bearer": [] }], @@ -953,7 +1161,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/BranchResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create database branch" } }, "security": [{ "bearer": [] }], @@ -974,7 +1184,9 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to disable preview branching" } }, "security": [{ "bearer": [] }], @@ -1003,7 +1215,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/BranchResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to fetch database branch" } }, "security": [{ "bearer": [] }], @@ -1032,7 +1246,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's custom hostname config" } }, "security": [{ "bearer": [] }], @@ -1052,7 +1268,9 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete project custom hostname configuration" } }, "security": [{ "bearer": [] }], @@ -1089,7 +1307,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project custom hostname configuration" } }, "security": [{ "bearer": [] }], @@ -1118,7 +1338,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to verify project custom hostname configuration" } }, "security": [{ "bearer": [] }], @@ -1147,7 +1369,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to activate project custom hostname configuration" } }, "security": [{ "bearer": [] }], @@ -1176,7 +1400,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's network bans" } }, "security": [{ "bearer": [] }], @@ -1205,7 +1431,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's enriched network bans" } }, "security": [{ "bearer": [] }], @@ -1235,7 +1463,9 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove network bans." } }, "security": [{ "bearer": [] }], @@ -1264,7 +1494,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's network restrictions" } }, "security": [{ "bearer": [] }], @@ -1299,7 +1531,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project network restrictions" } }, "security": [{ "bearer": [] }], @@ -1336,7 +1570,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project network restrictions" } }, "security": [{ "bearer": [] }], @@ -1365,7 +1601,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's pgsodium config" } }, "security": [{ "bearer": [] }], @@ -1400,7 +1638,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's pgsodium config" } }, "security": [{ "bearer": [] }], @@ -1429,7 +1669,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's postgrest config" } }, "security": [{ "bearer": [] }], @@ -1464,7 +1706,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's postgrest config" } }, "security": [{ "bearer": [] }], @@ -1493,7 +1737,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project" } }, "security": [{ "bearer": [] }], @@ -1520,7 +1766,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Deletes the given project", @@ -1552,7 +1800,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's secrets" } }, "security": [{ "bearer": [] }], @@ -1579,7 +1829,9 @@ }, "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create project's secrets" } }, "security": [{ "bearer": [] }], @@ -1606,7 +1858,9 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete secrets with given names" } }, "security": [{ "bearer": [] }], @@ -1635,7 +1889,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's SSL enforcement config" } }, "security": [{ "bearer": [] }], @@ -1670,7 +1926,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's SSL enforcement configuration." } }, "security": [{ "bearer": [] }], @@ -1706,7 +1964,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to generate TypeScript types" } }, "security": [{ "bearer": [] }], @@ -1735,7 +1995,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project vanity subdomain configuration" } }, "security": [{ "bearer": [] }], @@ -1755,7 +2017,9 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete project vanity subdomain configuration" } }, "security": [{ "bearer": [] }], @@ -1790,7 +2054,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to check project vanity subdomain configuration" } }, "security": [{ "bearer": [] }], @@ -1825,7 +2091,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to activate project vanity subdomain configuration" } }, "security": [{ "bearer": [] }], @@ -1860,7 +2128,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to initiate project upgrade" } }, "security": [{ "bearer": [] }], @@ -1889,7 +2159,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to determine project upgrade eligibility" } }, "security": [{ "bearer": [] }], @@ -1924,7 +2196,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project upgrade status" } }, "security": [{ "bearer": [] }], @@ -1953,7 +2227,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project readonly mode status" } }, "security": [{ "bearer": [] }], @@ -1975,7 +2251,9 @@ ], "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to disable project's readonly mode" } }, "security": [{ "bearer": [] }], @@ -2005,7 +2283,9 @@ }, "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to set up read replica" } }, "security": [{ "bearer": [] }], @@ -2035,7 +2315,9 @@ }, "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove read replica" } }, "security": [{ "bearer": [] }], @@ -2094,7 +2376,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's service health status" } }, "security": [{ "bearer": [] }], @@ -2123,7 +2407,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found.", @@ -2149,7 +2435,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found.", @@ -2185,7 +2473,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Create a new signing key for the project in standby status", @@ -2211,7 +2501,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "List all signing keys for the project", @@ -2245,7 +2537,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Get information about a signing key", @@ -2277,7 +2571,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Remove a signing key from a project. Only possible if the key has been in revoked status for a while.", @@ -2317,7 +2613,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Update a signing key, mainly its status", @@ -2345,7 +2643,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's storage config" } }, "security": [{ "bearer": [] }], @@ -2373,7 +2673,9 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's storage config" } }, "security": [{ "bearer": [] }], @@ -2402,7 +2704,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's Postgres config" } }, "security": [{ "bearer": [] }], @@ -2437,7 +2741,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's Postgres config" } }, "security": [{ "bearer": [] }], @@ -2466,7 +2772,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's pgbouncer config" } }, "summary": "Get project's pgbouncer config", @@ -2497,7 +2805,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's supavisor config" } }, "security": [{ "bearer": [] }], @@ -2532,7 +2842,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's supavisor config" } }, "security": [{ "bearer": [] }], @@ -2561,7 +2873,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's auth config" } }, "security": [{ "bearer": [] }], @@ -2596,7 +2910,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's auth config" } }, "security": [{ "bearer": [] }], @@ -2631,7 +2947,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyAuth" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Creates a new third-party auth integration", @@ -2660,7 +2978,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Lists all third-party auth integrations", @@ -2692,7 +3012,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyAuth" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Removes a third-party auth integration", @@ -2722,7 +3044,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyAuth" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Get a third-party integration", @@ -2741,7 +3065,12 @@ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } } ], - "responses": { "200": { "description": "" }, "403": { "description": "" } }, + "responses": { + "200": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Pauses the given project", "tags": ["Projects"] @@ -2770,7 +3099,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Lists available restore versions for the given project", @@ -2787,7 +3118,12 @@ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } } ], - "responses": { "200": { "description": "" }, "403": { "description": "" } }, + "responses": { + "200": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Restores the given project", "tags": ["Projects"] @@ -2805,7 +3141,12 @@ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } } ], - "responses": { "200": { "description": "" }, "403": { "description": "" } }, + "responses": { + "200": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Cancels the given project restoration", "tags": ["Projects"] @@ -2813,6 +3154,7 @@ }, "/v1/projects/{ref}/billing/addons": { "get": { + "description": "Returns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata.", "operationId": "v1-list-project-addons", "parameters": [ { @@ -2832,14 +3174,17 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list project addons" } }, "security": [{ "bearer": [] }], - "summary": "Lists project addons", + "summary": "List billing addons and compute instance selections", "tags": ["Billing"] }, "patch": { + "description": "Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project.", "operationId": "v1-apply-project-addon", "parameters": [ { @@ -2860,16 +3205,19 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to apply project addon" } }, "security": [{ "bearer": [] }], - "summary": "Applies project addon", + "summary": "Apply or update billing addons, including compute instance size", "tags": ["Billing"] } }, "/v1/projects/{ref}/billing/addons/{addon_variant}": { "delete": { + "description": "Disables the selected addon variant, including rolling the compute instance back to its previous size.", "operationId": "v1-remove-project-addon", "parameters": [ { @@ -2917,11 +3265,13 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove project addon" } }, "security": [{ "bearer": [] }], - "summary": "Removes project addon", + "summary": "Remove billing addons or revert compute instance sizing", "tags": ["Billing"] } }, @@ -2946,7 +3296,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets project claim token", @@ -2973,7 +3325,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Creates project claim token", @@ -2991,7 +3345,12 @@ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" } } ], - "responses": { "204": { "description": "" }, "403": { "description": "" } }, + "responses": { + "204": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Revokes project claim token", "tags": ["Projects"], @@ -3021,7 +3380,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets project performance advisors.", @@ -3057,7 +3418,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets project security advisors.", @@ -3097,7 +3460,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsResponse" } } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets project's logs", @@ -3134,7 +3499,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's usage api counts" } }, "security": [{ "bearer": [] }], @@ -3163,7 +3530,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's usage api requests count" } }, "security": [{ "bearer": [] }], @@ -3197,7 +3566,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's function combined statistics" } }, "security": [{ "bearer": [] }], @@ -3232,7 +3603,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create login role" } }, "security": [{ "bearer": [] }], @@ -3259,7 +3632,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete login roles" } }, "security": [{ "bearer": [] }], @@ -3289,7 +3664,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database migrations" } }, "security": [{ "bearer": [] }], @@ -3325,7 +3702,9 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to apply database migration" } }, "security": [{ "bearer": [] }], @@ -3361,7 +3740,9 @@ }, "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to upsert database migration" } }, "security": [{ "bearer": [] }], @@ -3389,7 +3770,9 @@ }, "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to run sql query" } }, "security": [{ "bearer": [] }], @@ -3411,7 +3794,9 @@ ], "responses": { "201": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to enable Database Webhooks on the project" } }, "security": [{ "bearer": [] }], @@ -3442,7 +3827,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets database metadata for the given project.", @@ -3469,7 +3856,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/JitAccessResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database jit access" } }, "security": [{ "bearer": [] }], @@ -3505,7 +3894,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to authorize database jit access" } }, "security": [{ "bearer": [] }], @@ -3537,7 +3928,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/JitAccessResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to upsert database migration" } }, "security": [{ "bearer": [] }], @@ -3567,7 +3960,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database jit access" } }, "security": [{ "bearer": [] }], @@ -3596,7 +3991,9 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove JIT access" } }, "security": [{ "bearer": [] }], @@ -3629,7 +4026,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's functions" } }, "security": [{ "bearer": [] }], @@ -3706,8 +4105,10 @@ "application/json": { "schema": { "$ref": "#/components/schemas/FunctionResponse" } } } }, + "401": { "description": "Unauthorized" }, "402": { "description": "Maximum number of functions reached for Plan" }, - "403": { "description": "" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create project's function" } }, "security": [{ "bearer": [] }], @@ -3743,8 +4144,10 @@ } } }, + "401": { "description": "Unauthorized" }, "402": { "description": "Maximum number of functions reached for Plan" }, - "403": { "description": "" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update functions" } }, "security": [{ "bearer": [] }], @@ -3795,8 +4198,10 @@ } } }, + "401": { "description": "Unauthorized" }, "402": { "description": "Maximum number of functions reached for Plan" }, - "403": { "description": "" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to deploy function" } }, "security": [{ "bearer": [] }], @@ -3833,7 +4238,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve function with given slug" } }, "security": [{ "bearer": [] }], @@ -3916,7 +4323,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/FunctionResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update function with given slug" } }, "security": [{ "bearer": [] }], @@ -3944,7 +4353,9 @@ ], "responses": { "200": { "description": "" }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete function with given slug" } }, "security": [{ "bearer": [] }], @@ -3979,7 +4390,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/StreamableFile" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve function body with given slug" } }, "security": [{ "bearer": [] }], @@ -4011,7 +4424,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get list of buckets" } }, "security": [{ "bearer": [] }], @@ -4046,8 +4461,10 @@ } } }, - "403": { "description": "" }, - "404": { "description": "SAML 2.0 support is not enabled for this project" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "404": { "description": "SAML 2.0 support is not enabled for this project" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Creates a new SSO provider", @@ -4073,8 +4490,10 @@ } } }, - "403": { "description": "" }, - "404": { "description": "SAML 2.0 support is not enabled for this project" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "404": { "description": "SAML 2.0 support is not enabled for this project" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Lists all SSO providers", @@ -4108,10 +4527,12 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, "404": { "description": "Either SAML 2.0 was not enabled for this project, or the provider does not exist" - } + }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets a SSO provider by its UUID", @@ -4149,10 +4570,12 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, "404": { "description": "Either SAML 2.0 was not enabled for this project, or the provider does not exist" - } + }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Updates a SSO provider by its UUID", @@ -4184,10 +4607,12 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, "404": { "description": "Either SAML 2.0 was not enabled for this project, or the provider does not exist" - } + }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Removes a SSO provider by its UUID", @@ -4213,7 +4638,9 @@ "application/json": { "schema": { "$ref": "#/components/schemas/V1BackupsResponse" } } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get backups" } }, "security": [{ "bearer": [] }], @@ -4239,7 +4666,12 @@ "application/json": { "schema": { "$ref": "#/components/schemas/V1RestorePitrBody" } } } }, - "responses": { "201": { "description": "" }, "403": { "description": "" } }, + "responses": { + "201": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Restores a PITR backup for a database", "tags": ["Database"] @@ -4274,7 +4706,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Initiates a creation of a restore point for a database", @@ -4307,7 +4741,9 @@ } } }, - "403": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get requested restore points" } }, "security": [{ "bearer": [] }], @@ -4334,7 +4770,12 @@ "application/json": { "schema": { "$ref": "#/components/schemas/V1UndoBody" } } } }, - "responses": { "201": { "description": "" }, "403": { "description": "" } }, + "responses": { + "201": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Initiates an undo to a given restore point", "tags": ["Database"], @@ -4365,7 +4806,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "List members of an organization", @@ -4393,7 +4836,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets information about the organization", @@ -4422,7 +4867,9 @@ } } }, - "403": { "description": "" } + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } }, "security": [{ "bearer": [] }], "summary": "Gets project details for the specified organization and claim token", @@ -4441,7 +4888,12 @@ }, { "name": "token", "required": true, "in": "path", "schema": { "type": "string" } } ], - "responses": { "204": { "description": "" }, "403": { "description": "" } }, + "responses": { + "204": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, "security": [{ "bearer": [] }], "summary": "Claims project for the specified organization", "tags": ["Organizations"], @@ -4926,6 +5378,143 @@ "content" ] }, + "ListActionRunResponse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "branch_id": { "type": "string" }, + "run_steps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": ["clone", "pull", "health", "configure", "migrate", "seed", "deploy"] + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "DEAD", + "EXITED", + "PAUSED", + "REMOVING", + "RESTARTING", + "RUNNING" + ] + }, + "created_at": { "type": "string" }, + "updated_at": { "type": "string" } + }, + "required": ["name", "status", "created_at", "updated_at"] + } + }, + "git_config": { "nullable": true }, + "workdir": { "type": "string", "nullable": true }, + "check_run_id": { "type": "number", "nullable": true }, + "created_at": { "type": "string" }, + "updated_at": { "type": "string" } + }, + "required": [ + "id", + "branch_id", + "run_steps", + "workdir", + "check_run_id", + "created_at", + "updated_at" + ] + } + }, + "ActionRunResponse": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "branch_id": { "type": "string" }, + "run_steps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": ["clone", "pull", "health", "configure", "migrate", "seed", "deploy"] + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "DEAD", + "EXITED", + "PAUSED", + "REMOVING", + "RESTARTING", + "RUNNING" + ] + }, + "created_at": { "type": "string" }, + "updated_at": { "type": "string" } + }, + "required": ["name", "status", "created_at", "updated_at"] + } + }, + "git_config": { "nullable": true }, + "workdir": { "type": "string", "nullable": true }, + "check_run_id": { "type": "number", "nullable": true }, + "created_at": { "type": "string" }, + "updated_at": { "type": "string" } + }, + "required": [ + "id", + "branch_id", + "run_steps", + "workdir", + "check_run_id", + "created_at", + "updated_at" + ] + }, + "UpdateRunStatusBody": { + "type": "object", + "properties": { + "clone": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "pull": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "health": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "configure": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "migrate": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "seed": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + }, + "deploy": { + "type": "string", + "enum": ["CREATED", "DEAD", "EXITED", "PAUSED", "REMOVING", "RESTARTING", "RUNNING"] + } + } + }, + "UpdateRunStatusResponse": { + "type": "object", + "properties": { "message": { "type": "string", "enum": ["ok"] } }, + "required": ["message"] + }, "ApiKeyResponse": { "type": "object", "properties": { @@ -5961,64 +6550,82 @@ "external_anonymous_users_enabled": { "type": "boolean", "nullable": true }, "external_apple_additional_client_ids": { "type": "string", "nullable": true }, "external_apple_client_id": { "type": "string", "nullable": true }, + "external_apple_email_optional": { "type": "boolean", "nullable": true }, "external_apple_enabled": { "type": "boolean", "nullable": true }, "external_apple_secret": { "type": "string", "nullable": true }, "external_azure_client_id": { "type": "string", "nullable": true }, + "external_azure_email_optional": { "type": "boolean", "nullable": true }, "external_azure_enabled": { "type": "boolean", "nullable": true }, "external_azure_secret": { "type": "string", "nullable": true }, "external_azure_url": { "type": "string", "nullable": true }, "external_bitbucket_client_id": { "type": "string", "nullable": true }, + "external_bitbucket_email_optional": { "type": "boolean", "nullable": true }, "external_bitbucket_enabled": { "type": "boolean", "nullable": true }, "external_bitbucket_secret": { "type": "string", "nullable": true }, "external_discord_client_id": { "type": "string", "nullable": true }, + "external_discord_email_optional": { "type": "boolean", "nullable": true }, "external_discord_enabled": { "type": "boolean", "nullable": true }, "external_discord_secret": { "type": "string", "nullable": true }, "external_email_enabled": { "type": "boolean", "nullable": true }, "external_facebook_client_id": { "type": "string", "nullable": true }, + "external_facebook_email_optional": { "type": "boolean", "nullable": true }, "external_facebook_enabled": { "type": "boolean", "nullable": true }, "external_facebook_secret": { "type": "string", "nullable": true }, "external_figma_client_id": { "type": "string", "nullable": true }, + "external_figma_email_optional": { "type": "boolean", "nullable": true }, "external_figma_enabled": { "type": "boolean", "nullable": true }, "external_figma_secret": { "type": "string", "nullable": true }, "external_github_client_id": { "type": "string", "nullable": true }, + "external_github_email_optional": { "type": "boolean", "nullable": true }, "external_github_enabled": { "type": "boolean", "nullable": true }, "external_github_secret": { "type": "string", "nullable": true }, "external_gitlab_client_id": { "type": "string", "nullable": true }, + "external_gitlab_email_optional": { "type": "boolean", "nullable": true }, "external_gitlab_enabled": { "type": "boolean", "nullable": true }, "external_gitlab_secret": { "type": "string", "nullable": true }, "external_gitlab_url": { "type": "string", "nullable": true }, "external_google_additional_client_ids": { "type": "string", "nullable": true }, "external_google_client_id": { "type": "string", "nullable": true }, + "external_google_email_optional": { "type": "boolean", "nullable": true }, "external_google_enabled": { "type": "boolean", "nullable": true }, "external_google_secret": { "type": "string", "nullable": true }, "external_google_skip_nonce_check": { "type": "boolean", "nullable": true }, "external_kakao_client_id": { "type": "string", "nullable": true }, + "external_kakao_email_optional": { "type": "boolean", "nullable": true }, "external_kakao_enabled": { "type": "boolean", "nullable": true }, "external_kakao_secret": { "type": "string", "nullable": true }, "external_keycloak_client_id": { "type": "string", "nullable": true }, + "external_keycloak_email_optional": { "type": "boolean", "nullable": true }, "external_keycloak_enabled": { "type": "boolean", "nullable": true }, "external_keycloak_secret": { "type": "string", "nullable": true }, "external_keycloak_url": { "type": "string", "nullable": true }, "external_linkedin_oidc_client_id": { "type": "string", "nullable": true }, + "external_linkedin_oidc_email_optional": { "type": "boolean", "nullable": true }, "external_linkedin_oidc_enabled": { "type": "boolean", "nullable": true }, "external_linkedin_oidc_secret": { "type": "string", "nullable": true }, "external_slack_oidc_client_id": { "type": "string", "nullable": true }, + "external_slack_oidc_email_optional": { "type": "boolean", "nullable": true }, "external_slack_oidc_enabled": { "type": "boolean", "nullable": true }, "external_slack_oidc_secret": { "type": "string", "nullable": true }, "external_notion_client_id": { "type": "string", "nullable": true }, + "external_notion_email_optional": { "type": "boolean", "nullable": true }, "external_notion_enabled": { "type": "boolean", "nullable": true }, "external_notion_secret": { "type": "string", "nullable": true }, "external_phone_enabled": { "type": "boolean", "nullable": true }, "external_slack_client_id": { "type": "string", "nullable": true }, + "external_slack_email_optional": { "type": "boolean", "nullable": true }, "external_slack_enabled": { "type": "boolean", "nullable": true }, "external_slack_secret": { "type": "string", "nullable": true }, "external_spotify_client_id": { "type": "string", "nullable": true }, + "external_spotify_email_optional": { "type": "boolean", "nullable": true }, "external_spotify_enabled": { "type": "boolean", "nullable": true }, "external_spotify_secret": { "type": "string", "nullable": true }, "external_twitch_client_id": { "type": "string", "nullable": true }, + "external_twitch_email_optional": { "type": "boolean", "nullable": true }, "external_twitch_enabled": { "type": "boolean", "nullable": true }, "external_twitch_secret": { "type": "string", "nullable": true }, "external_twitter_client_id": { "type": "string", "nullable": true }, + "external_twitter_email_optional": { "type": "boolean", "nullable": true }, "external_twitter_enabled": { "type": "boolean", "nullable": true }, "external_twitter_secret": { "type": "string", "nullable": true }, "external_workos_client_id": { "type": "string", "nullable": true }, @@ -6028,6 +6635,7 @@ "external_web3_solana_enabled": { "type": "boolean", "nullable": true }, "external_web3_ethereum_enabled": { "type": "boolean", "nullable": true }, "external_zoom_client_id": { "type": "string", "nullable": true }, + "external_zoom_email_optional": { "type": "boolean", "nullable": true }, "external_zoom_enabled": { "type": "boolean", "nullable": true }, "external_zoom_secret": { "type": "string", "nullable": true }, "hook_custom_access_token_enabled": { "type": "boolean", "nullable": true }, @@ -6077,6 +6685,7 @@ "mfa_phone_template": { "type": "string", "nullable": true }, "mfa_phone_max_frequency": { "type": "integer", "nullable": true }, "nimbus_oauth_client_id": { "type": "string", "nullable": true }, + "nimbus_oauth_email_optional": { "type": "boolean", "nullable": true }, "nimbus_oauth_client_secret": { "type": "string", "nullable": true }, "password_hibp_enabled": { "type": "boolean", "nullable": true }, "password_min_length": { "type": "integer", "nullable": true }, @@ -6161,64 +6770,82 @@ "external_anonymous_users_enabled", "external_apple_additional_client_ids", "external_apple_client_id", + "external_apple_email_optional", "external_apple_enabled", "external_apple_secret", "external_azure_client_id", + "external_azure_email_optional", "external_azure_enabled", "external_azure_secret", "external_azure_url", "external_bitbucket_client_id", + "external_bitbucket_email_optional", "external_bitbucket_enabled", "external_bitbucket_secret", "external_discord_client_id", + "external_discord_email_optional", "external_discord_enabled", "external_discord_secret", "external_email_enabled", "external_facebook_client_id", + "external_facebook_email_optional", "external_facebook_enabled", "external_facebook_secret", "external_figma_client_id", + "external_figma_email_optional", "external_figma_enabled", "external_figma_secret", "external_github_client_id", + "external_github_email_optional", "external_github_enabled", "external_github_secret", "external_gitlab_client_id", + "external_gitlab_email_optional", "external_gitlab_enabled", "external_gitlab_secret", "external_gitlab_url", "external_google_additional_client_ids", "external_google_client_id", + "external_google_email_optional", "external_google_enabled", "external_google_secret", "external_google_skip_nonce_check", "external_kakao_client_id", + "external_kakao_email_optional", "external_kakao_enabled", "external_kakao_secret", "external_keycloak_client_id", + "external_keycloak_email_optional", "external_keycloak_enabled", "external_keycloak_secret", "external_keycloak_url", "external_linkedin_oidc_client_id", + "external_linkedin_oidc_email_optional", "external_linkedin_oidc_enabled", "external_linkedin_oidc_secret", "external_slack_oidc_client_id", + "external_slack_oidc_email_optional", "external_slack_oidc_enabled", "external_slack_oidc_secret", "external_notion_client_id", + "external_notion_email_optional", "external_notion_enabled", "external_notion_secret", "external_phone_enabled", "external_slack_client_id", + "external_slack_email_optional", "external_slack_enabled", "external_slack_secret", "external_spotify_client_id", + "external_spotify_email_optional", "external_spotify_enabled", "external_spotify_secret", "external_twitch_client_id", + "external_twitch_email_optional", "external_twitch_enabled", "external_twitch_secret", "external_twitter_client_id", + "external_twitter_email_optional", "external_twitter_enabled", "external_twitter_secret", "external_workos_client_id", @@ -6228,6 +6855,7 @@ "external_web3_solana_enabled", "external_web3_ethereum_enabled", "external_zoom_client_id", + "external_zoom_email_optional", "external_zoom_enabled", "external_zoom_secret", "hook_custom_access_token_enabled", @@ -6277,6 +6905,7 @@ "mfa_phone_template", "mfa_phone_max_frequency", "nimbus_oauth_client_id", + "nimbus_oauth_email_optional", "nimbus_oauth_client_secret", "password_hibp_enabled", "password_min_length", @@ -6528,63 +7157,81 @@ "hook_before_user_created_secrets": { "type": "string", "nullable": true }, "external_apple_enabled": { "type": "boolean", "nullable": true }, "external_apple_client_id": { "type": "string", "nullable": true }, + "external_apple_email_optional": { "type": "boolean", "nullable": true }, "external_apple_secret": { "type": "string", "nullable": true }, "external_apple_additional_client_ids": { "type": "string", "nullable": true }, "external_azure_enabled": { "type": "boolean", "nullable": true }, "external_azure_client_id": { "type": "string", "nullable": true }, + "external_azure_email_optional": { "type": "boolean", "nullable": true }, "external_azure_secret": { "type": "string", "nullable": true }, "external_azure_url": { "type": "string", "nullable": true }, "external_bitbucket_enabled": { "type": "boolean", "nullable": true }, "external_bitbucket_client_id": { "type": "string", "nullable": true }, + "external_bitbucket_email_optional": { "type": "boolean", "nullable": true }, "external_bitbucket_secret": { "type": "string", "nullable": true }, "external_discord_enabled": { "type": "boolean", "nullable": true }, "external_discord_client_id": { "type": "string", "nullable": true }, + "external_discord_email_optional": { "type": "boolean", "nullable": true }, "external_discord_secret": { "type": "string", "nullable": true }, "external_facebook_enabled": { "type": "boolean", "nullable": true }, "external_facebook_client_id": { "type": "string", "nullable": true }, + "external_facebook_email_optional": { "type": "boolean", "nullable": true }, "external_facebook_secret": { "type": "string", "nullable": true }, "external_figma_enabled": { "type": "boolean", "nullable": true }, "external_figma_client_id": { "type": "string", "nullable": true }, + "external_figma_email_optional": { "type": "boolean", "nullable": true }, "external_figma_secret": { "type": "string", "nullable": true }, "external_github_enabled": { "type": "boolean", "nullable": true }, "external_github_client_id": { "type": "string", "nullable": true }, + "external_github_email_optional": { "type": "boolean", "nullable": true }, "external_github_secret": { "type": "string", "nullable": true }, "external_gitlab_enabled": { "type": "boolean", "nullable": true }, "external_gitlab_client_id": { "type": "string", "nullable": true }, + "external_gitlab_email_optional": { "type": "boolean", "nullable": true }, "external_gitlab_secret": { "type": "string", "nullable": true }, "external_gitlab_url": { "type": "string", "nullable": true }, "external_google_enabled": { "type": "boolean", "nullable": true }, "external_google_client_id": { "type": "string", "nullable": true }, + "external_google_email_optional": { "type": "boolean", "nullable": true }, "external_google_secret": { "type": "string", "nullable": true }, "external_google_additional_client_ids": { "type": "string", "nullable": true }, "external_google_skip_nonce_check": { "type": "boolean", "nullable": true }, "external_kakao_enabled": { "type": "boolean", "nullable": true }, "external_kakao_client_id": { "type": "string", "nullable": true }, + "external_kakao_email_optional": { "type": "boolean", "nullable": true }, "external_kakao_secret": { "type": "string", "nullable": true }, "external_keycloak_enabled": { "type": "boolean", "nullable": true }, "external_keycloak_client_id": { "type": "string", "nullable": true }, + "external_keycloak_email_optional": { "type": "boolean", "nullable": true }, "external_keycloak_secret": { "type": "string", "nullable": true }, "external_keycloak_url": { "type": "string", "nullable": true }, "external_linkedin_oidc_enabled": { "type": "boolean", "nullable": true }, "external_linkedin_oidc_client_id": { "type": "string", "nullable": true }, + "external_linkedin_oidc_email_optional": { "type": "boolean", "nullable": true }, "external_linkedin_oidc_secret": { "type": "string", "nullable": true }, "external_slack_oidc_enabled": { "type": "boolean", "nullable": true }, "external_slack_oidc_client_id": { "type": "string", "nullable": true }, + "external_slack_oidc_email_optional": { "type": "boolean", "nullable": true }, "external_slack_oidc_secret": { "type": "string", "nullable": true }, "external_notion_enabled": { "type": "boolean", "nullable": true }, "external_notion_client_id": { "type": "string", "nullable": true }, + "external_notion_email_optional": { "type": "boolean", "nullable": true }, "external_notion_secret": { "type": "string", "nullable": true }, "external_slack_enabled": { "type": "boolean", "nullable": true }, "external_slack_client_id": { "type": "string", "nullable": true }, + "external_slack_email_optional": { "type": "boolean", "nullable": true }, "external_slack_secret": { "type": "string", "nullable": true }, "external_spotify_enabled": { "type": "boolean", "nullable": true }, "external_spotify_client_id": { "type": "string", "nullable": true }, + "external_spotify_email_optional": { "type": "boolean", "nullable": true }, "external_spotify_secret": { "type": "string", "nullable": true }, "external_twitch_enabled": { "type": "boolean", "nullable": true }, "external_twitch_client_id": { "type": "string", "nullable": true }, + "external_twitch_email_optional": { "type": "boolean", "nullable": true }, "external_twitch_secret": { "type": "string", "nullable": true }, "external_twitter_enabled": { "type": "boolean", "nullable": true }, "external_twitter_client_id": { "type": "string", "nullable": true }, + "external_twitter_email_optional": { "type": "boolean", "nullable": true }, "external_twitter_secret": { "type": "string", "nullable": true }, "external_workos_enabled": { "type": "boolean", "nullable": true }, "external_workos_client_id": { "type": "string", "nullable": true }, @@ -6594,6 +7241,7 @@ "external_web3_ethereum_enabled": { "type": "boolean", "nullable": true }, "external_zoom_enabled": { "type": "boolean", "nullable": true }, "external_zoom_client_id": { "type": "string", "nullable": true }, + "external_zoom_email_optional": { "type": "boolean", "nullable": true }, "external_zoom_secret": { "type": "string", "nullable": true }, "db_max_pool_size": { "type": "integer", "nullable": true }, "api_max_request_duration": { "type": "integer", "nullable": true }, diff --git a/apps/docs/spec/cli_v1_commands.yaml b/apps/docs/spec/cli_v1_commands.yaml index 502a47a585d..153dc0f52f0 100644 --- a/apps/docs/spec/cli_v1_commands.yaml +++ b/apps/docs/spec/cli_v1_commands.yaml @@ -1,7 +1,7 @@ clispec: '001' info: id: cli - version: 2.45.5 + version: 2.48.3 title: Supabase CLI language: sh source: https://github.com/supabase/cli @@ -78,7 +78,7 @@ flags: name: --workdir description: path to a Supabase project directory default_value: '' - - id: "yes" + - id: 'yes' name: --yes description: answer yes to all prompts default_value: 'false' @@ -2359,6 +2359,10 @@ commands: name: --exp

- alter policy {oldName} + alter policy "{oldName}"

diff --git a/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx b/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx new file mode 100644 index 00000000000..36cfe1cf8ad --- /dev/null +++ b/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx @@ -0,0 +1,89 @@ +import type { PropsWithChildren } from 'react' + +import { ActionName, ActionStatus, type ActionRunStep } from 'data/actions/action-runs-query' +import { Badge, StatusIcon, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + +export interface ActionStatusBadgeProps { + name: ActionName + status: ActionStatus +} + +const UNHEALTHY_STATUES: ActionStatus[] = ['DEAD', 'REMOVING'] +const WAITING_STATUSES: ActionStatus[] = ['CREATED', 'RESTARTING', 'RUNNING'] + +export const STATUS_TO_LABEL: Record = { + CREATED: 'pending', + DEAD: 'failed', + EXITED: 'succeeded', + PAUSED: 'skipped', + REMOVING: 'failed', + RESTARTING: 'restarting', + RUNNING: 'running', +} + +const NAME_TO_LABEL: Record = { + clone: 'Cloning repo', + pull: 'Pulling data', + health: 'Health check', + configure: 'Configurations', + migrate: 'Migrations', + seed: 'Data seeding', + deploy: 'Functions deployment', +} + +export const ActionStatusBadgeCondensed = ({ + children, + status, + details, +}: PropsWithChildren<{ + status: ActionStatus + details: Array +}>) => { + if (status === 'EXITED') { + return null + } + + const isUnhealthy = UNHEALTHY_STATUES.includes(status) + const isWaiting = WAITING_STATUSES.includes(status) + + return ( + + + + {(isUnhealthy || isWaiting) && ( + + )} + {children} + + + + Additional {STATUS_TO_LABEL[status]} steps: +
    + {details.map((step) => ( +
  • + {NAME_TO_LABEL[step.name]} +
  • + ))} +
+
+
+ ) +} + +export const ActionStatusBadge = ({ name, status }: ActionStatusBadgeProps) => { + if (status === 'EXITED') { + return null + } + + const isUnhealthy = UNHEALTHY_STATUES.includes(status) + const isWaiting = WAITING_STATUSES.includes(status) + + return ( + + {(isUnhealthy || isWaiting) && ( + + )} + {NAME_TO_LABEL[name]}: {STATUS_TO_LABEL[status]} + + ) +} diff --git a/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx b/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx index fddc2017c14..29253f09d9b 100644 --- a/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx +++ b/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx @@ -1,12 +1,17 @@ -import type { Branch } from 'data/branches/branches-query' import dayjs from 'dayjs' +import { groupBy } from 'lodash' import { ArrowLeft, ArrowRight } from 'lucide-react' import { useState } from 'react' -import { StatusIcon } from 'ui' import AlertError from 'components/ui/AlertError' -import { useWorkflowRunLogsQuery } from 'data/workflow-runs/workflow-run-logs-query' -import { useWorkflowRunsQuery } from 'data/workflow-runs/workflow-runs-query' +import { ActionRunData } from 'data/actions/action-detail-query' +import { useActionRunLogsQuery } from 'data/actions/action-logs-query' +import { + useActionsQuery, + type ActionRunStep, + type ActionStatus, +} from 'data/actions/action-runs-query' +import type { Branch } from 'data/branches/branches-query' import { Button, cn, @@ -18,24 +23,21 @@ import { DialogSectionSeparator, DialogTitle, DialogTrigger, + StatusIcon, } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' +import { ActionStatusBadge, ActionStatusBadgeCondensed, STATUS_TO_LABEL } from './ActionStatusBadge' import BranchStatusBadge from './BranchStatusBadge' interface WorkflowLogsProps { projectRef: string - status?: Branch['status'] | string + status: Branch['status'] } -type StatusType = Branch['status'] | string +type StatusType = Branch['status'] -const UNHEALTHY_STATUSES: StatusType[] = [ - 'ACTIVE_UNHEALTHY', - 'INIT_FAILED', - 'UNKNOWN', - 'MIGRATIONS_FAILED', - 'FUNCTIONS_FAILED', -] +const HEALTHY_STATUSES: StatusType[] = ['FUNCTIONS_DEPLOYED', 'MIGRATIONS_PASSED'] +const UNHEALTHY_STATUSES: StatusType[] = ['MIGRATIONS_FAILED', 'FUNCTIONS_FAILED'] export const WorkflowLogs = ({ projectRef, status }: WorkflowLogsProps) => { const [isOpen, setIsOpen] = useState(false) @@ -46,9 +48,11 @@ export const WorkflowLogs = ({ projectRef, status }: WorkflowLogsProps) => { isLoading: isWorkflowRunsLoading, isError: isWorkflowRunsError, error: workflowRunsError, - } = useWorkflowRunsQuery({ projectRef }, { enabled: isOpen }) + } = useActionsQuery({ ref: projectRef }, { enabled: isOpen }) - const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState(undefined) + const [selectedWorkflowRun, setSelectedWorkflowRun] = useState( + undefined + ) const { data: workflowRunLogs, @@ -56,17 +60,13 @@ export const WorkflowLogs = ({ projectRef, status }: WorkflowLogsProps) => { isLoading: isWorkflowRunLogsLoading, isError: isWorkflowRunLogsError, error: workflowRunLogsError, - } = useWorkflowRunLogsQuery( - { workflowRunId: selectedWorkflowRunId }, - { enabled: isOpen && selectedWorkflowRunId !== undefined } + } = useActionRunLogsQuery( + { ref: projectRef, run_id: selectedWorkflowRun?.id ?? '' }, + { enabled: isOpen && Boolean(selectedWorkflowRun) } ) - const showStatusIcon = - status !== undefined && - status !== 'ACTIVE_HEALTHY' && - status !== 'FUNCTIONS_DEPLOYED' && - status !== 'MIGRATIONS_PASSED' - const isUnhealthy = status !== undefined && UNHEALTHY_STATUSES.includes(status) + const showStatusIcon = !HEALTHY_STATUSES.includes(status) + const isUnhealthy = UNHEALTHY_STATUSES.includes(status) return ( @@ -93,7 +93,7 @@ export const WorkflowLogs = ({ projectRef, status }: WorkflowLogsProps) => { - {selectedWorkflowRunId === undefined ? ( + {!selectedWorkflowRun ? ( <> {isWorkflowRunsLoading && } {isWorkflowRunsError && ( @@ -108,11 +108,15 @@ export const WorkflowLogs = ({ projectRef, status }: WorkflowLogsProps) => {
  • ) } + +function RunSteps({ steps }: { steps: Array }) { + const stepsByStatus = groupBy(steps, 'status') as Record> + const firstFailedStep = stepsByStatus.DEAD?.[0] + const numberFailedSteps = stepsByStatus.DEAD?.length ?? 0 + + return ( + <> + {firstFailedStep && ( + + )} + {numberFailedSteps > 1 && ( + + {numberFailedSteps - 1} more + + )} + {(Object.keys(stepsByStatus) as Array) + .filter((status) => status !== 'DEAD') + .map((status) => ( + + {stepsByStatus[status].length} {STATUS_TO_LABEL[status]} + + ))} + + ) +} diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx index 82ca681b973..481251005de 100644 --- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx +++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx @@ -115,10 +115,11 @@ const FunctionsList = ({ showError={false} selectedSchemaName={selectedSchema} onSelectSchema={(schema) => { - const url = new URL(document.URL) - url.searchParams.delete('search') - router.push(url) - setSelectedSchema(schema) + setFilterString('') + // Wait for the filter to be cleared from the URL + setTimeout(() => { + setSelectedSchema(schema) + }, 50) }} /> [number] -}) => { +export const PreviousRestoreItem = ({ clone }: { clone: CloneStatus['clones'][number] }) => { if (clone.status === 'REMOVED') { return (
    -
    {(clone.target_project as any).name}
    +
    {clone.target_project?.name ?? 'Unknown project'}
    @@ -28,10 +24,10 @@ export const PreviousRestoreItem = ({ } else { return ( -
    {(clone.target_project as any).name}
    +
    {clone.target_project?.name ?? 'Unknown project'}
    diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx index 3d6f2287f0a..9160a211ca5 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx @@ -1,7 +1,7 @@ import { PostgresTrigger } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' -import { Plus, Search } from 'lucide-react' +import { DatabaseZap, FunctionSquare, Plus, Search, Shield } from 'lucide-react' import { useState } from 'react' import AlphaPreview from 'components/to-be-cleaned/AlphaPreview' @@ -19,7 +19,10 @@ import { useIsProtectedSchema, useProtectedSchemas } from 'hooks/useProtectedSch import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { AiIconAnimation, + Button, Card, + CardContent, + cn, Input, Table, TableBody, @@ -29,6 +32,7 @@ import { } from 'ui' import { ProtectedSchemaWarning } from '../../ProtectedSchemaWarning' import TriggerList from './TriggerList' +import Link from 'next/link' interface TriggersListProps { createTrigger: () => void @@ -79,146 +83,159 @@ const TriggersList = ({ return } - return ( - <> - {(triggers ?? []).length === 0 ? ( -
    - createTrigger()} - > - -

    - A PostgreSQL trigger is a function invoked automatically whenever an event associated - with a table occurs. -

    -

    - An event could be any of the following: INSERT, UPDATE, DELETE. A trigger is a special - user-defined function associated with a table. -

    -
    -
    - ) : ( -
    -
    -
    - - } - value={filterString} - className="w-full lg:w-52" - onChange={(e) => setFilterString(e.target.value)} - /> -
    - {!isSchemaLocked && ( -
    - } - onClick={() => createTrigger()} - className="flex-grow" - tooltip={{ - content: { - side: 'bottom', - text: !hasTables - ? 'Create a table first before creating triggers' - : !canCreateTriggers - ? 'You need additional permissions to create triggers' - : undefined, - }, - }} - > - New trigger - + const schemaTriggers = triggers.filter((x) => x.schema == selectedSchema) - {hasTables && ( - } - onClick={() => - aiSnap.newChat({ - name: 'Create new trigger', - open: true, - initialInput: `Create a new trigger for the schema ${selectedSchema} that does ...`, - suggestions: { - title: - 'I can help you create a new trigger, here are a few example prompts to get you started:', - prompts: [ - { - label: 'Log Changes', - description: 'Create a trigger that logs changes to the users table', - }, - { - label: 'Update Timestamp', - description: 'Create a trigger that updates updated_at timestamp', - }, - { - label: 'Validate Email', - description: - 'Create a trigger that validates email format before insert', - }, - ], + return ( +
    +
    +
    + + } + value={filterString} + className="w-full lg:w-52" + onChange={(e) => setFilterString(e.target.value)} + /> +
    + {!isSchemaLocked && ( +
    + } + onClick={() => createTrigger()} + className="flex-grow" + tooltip={{ + content: { + side: 'bottom', + text: !hasTables + ? 'Create a table first before creating triggers' + : !canCreateTriggers + ? 'You need additional permissions to create triggers' + : undefined, + }, + }} + > + New trigger + + + {hasTables && ( + } + onClick={() => + aiSnap.newChat({ + name: 'Create new trigger', + open: true, + initialInput: `Create a new trigger for the schema ${selectedSchema} that does ...`, + suggestions: { + title: + 'I can help you create a new trigger, here are a few example prompts to get you started:', + prompts: [ + { + label: 'Log Changes', + description: 'Create a trigger that logs changes to the users table', }, - }) - } - tooltip={{ - content: { - side: 'bottom', - text: !canCreateTriggers - ? 'You need additional permissions to create triggers' - : 'Create with Supabase Assistant', - }, - }} - /> - )} -
    + { + label: 'Update Timestamp', + description: 'Create a trigger that updates updated_at timestamp', + }, + { + label: 'Validate Email', + description: 'Create a trigger that validates email format before insert', + }, + ], + }, + }) + } + tooltip={{ + content: { + side: 'bottom', + text: !canCreateTriggers + ? 'You need additional permissions to create triggers' + : 'Create with Supabase Assistant', + }, + }} + /> )}
    + )} +
    - {isSchemaLocked && } + {isSchemaLocked && } -
    - - - - - Name - Table - Function - Events - Orientation - - Enabled - - - - - - - -
    -
    + {!isSchemaLocked && (schemaTriggers ?? []).length === 0 ? ( + +
    +
    + +

    Create realtime experiences

    +
    +

    + Keep your application in sync by automatically updating when data changes +

    + +
    +
    + +

    Trigger an edge function

    +
    +

    + Automatically invoke edge functions when database events occur +

    +
    + +
    +
    + +

    Validate data

    +
    +

    + Ensure data meets your requirements before it is inserted into the database +

    +
    +
    + ) : ( +
    + + + + + Name + Table + Function + Events + Orientation + + Enabled + + + + + + + +
    +
    )} - +
    ) } diff --git a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx index 9b6057676a2..5cb2a24a83f 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx @@ -88,7 +88,7 @@ export function DiskSizeField({ const mainDiskUsed = Math.round(((diskUtil?.metrics.fs_used_bytes ?? 0) / GB) * 100) / 100 return ( -
    +
    curl -L -X POST '{functionsEndpoint} - /hello-world' -H 'Authorization: Bearer [YOUR ANON KEY]' s + /hello-world' -H 'Authorization: Bearer [YOUR ANON KEY]' {anonKey?.type === 'publishable' ? " -H 'apikey: [YOUR ANON KEY]' " : ''} {`--data '{"name":"Functions"}'`} diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx index 35afb66f841..f80c24edb75 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx @@ -5,7 +5,7 @@ import CardButton from 'components/ui/CardButton' import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' import { ProjectIndexPageLink } from 'data/prefetchers/project.$ref' -import { OrgProject } from 'data/projects/projects-infinite-query' +import { OrgProject } from 'data/projects/org-projects-infinite-query' import type { ResourceWarning } from 'data/usage/resource-warnings-query' import { useCustomContent } from 'hooks/custom-content/useCustomContent' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx index 927c0d86e65..5bfb9b0214d 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx @@ -7,7 +7,7 @@ import NoSearchResults from 'components/ui/NoSearchResults' import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' import { useOrgIntegrationsQuery } from 'data/integrations/integrations-query-org-only' import { usePermissionsQuery } from 'data/permissions/permissions-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' +import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx index 7039687da79..20bc9dc1e40 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx @@ -4,7 +4,7 @@ import InlineSVG from 'react-inlinesvg' import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' -import { OrgProject } from 'data/projects/projects-infinite-query' +import { OrgProject } from 'data/projects/org-projects-infinite-query' import type { ResourceWarning } from 'data/usage/resource-warnings-query' import { BASE_PATH } from 'lib/constants' import { Organization } from 'types' diff --git a/apps/studio/components/interfaces/HomePageActions.tsx b/apps/studio/components/interfaces/HomePageActions.tsx index 64058004de5..7e07fcce3dd 100644 --- a/apps/studio/components/interfaces/HomePageActions.tsx +++ b/apps/studio/components/interfaces/HomePageActions.tsx @@ -3,7 +3,7 @@ import Link from 'next/link' import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { useOrgProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' +import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { PROJECT_STATUS } from 'lib/constants' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.constants.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.constants.ts new file mode 100644 index 00000000000..a9f70ce8c2a --- /dev/null +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.constants.ts @@ -0,0 +1,122 @@ +import { toString as CronToString } from 'cronstrue' +import z from 'zod' + +import { urlRegex } from 'components/interfaces/Auth/Auth.constants' +import { cronPattern, secondsPattern } from '../CronJobs.constants' + +const convertCronToString = (schedule: string) => { + // pg_cron can also use "30 seconds" format for schedule. Cronstrue doesn't understand that format so just use the + // original schedule when cronstrue throws + try { + return CronToString(schedule) + } catch (error) { + return schedule + } +} + +const edgeFunctionSchema = z.object({ + type: z.literal('edge_function'), + method: z.enum(['GET', 'POST']), + edgeFunctionName: z.string().trim().min(1, 'Please select one of the listed Edge Functions'), + timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), + httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), + httpBody: z + .string() + .trim() + .optional() + .refine((value) => { + if (!value) return true + try { + JSON.parse(value) + return true + } catch { + return false + } + }, 'Input must be valid JSON'), + // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it + snippet: z.string().trim(), +}) + +const httpRequestSchema = z.object({ + type: z.literal('http_request'), + method: z.enum(['GET', 'POST']), + endpoint: z + .string() + .trim() + .min(1, 'Please provide a URL') + .regex(urlRegex(), 'Please provide a valid URL') + .refine((value) => value.startsWith('http'), 'Please include HTTP/HTTPs to your URL'), + timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), + httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), + httpBody: z + .string() + .trim() + .optional() + .refine((value) => { + if (!value) return true + try { + JSON.parse(value) + return true + } catch { + return false + } + }, 'Input must be valid JSON'), + // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it + snippet: z.string().trim(), +}) + +const sqlFunctionSchema = z.object({ + type: z.literal('sql_function'), + schema: z.string().trim().min(1, 'Please select one of the listed database schemas'), + functionName: z.string().trim().min(1, 'Please select one of the listed database functions'), + // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it + snippet: z.string().trim(), +}) + +const sqlSnippetSchema = z.object({ + type: z.literal('sql_snippet'), + snippet: z.string().trim().min(1), +}) + +export const FormSchema = z + .object({ + name: z.string().trim().min(1, 'Please provide a name for your cron job'), + supportsSeconds: z.boolean(), + schedule: z + .string() + .trim() + .min(1) + .refine((value) => { + if (cronPattern.test(value)) { + try { + convertCronToString(value) + return true + } catch { + return false + } + } else if (secondsPattern.test(value)) { + return true + } + return false + }, 'Invalid Cron format'), + values: z.discriminatedUnion('type', [ + edgeFunctionSchema, + httpRequestSchema, + sqlFunctionSchema, + sqlSnippetSchema, + ]), + }) + .superRefine((data, ctx) => { + if (!cronPattern.test(data.schedule)) { + if (!(data.supportsSeconds && secondsPattern.test(data.schedule))) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Seconds are supported only in pg_cron v1.5.0+. Please use a valid Cron format.', + path: ['schedule'], + }) + } + } + }) + +export type CreateCronJobForm = z.infer +export type CronJobType = CreateCronJobForm['values'] diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx similarity index 79% rename from apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx rename to apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx index e7a42f67760..057ba40cb9c 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx @@ -1,15 +1,12 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { toString as CronToString } from 'cronstrue' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' import { useWatch } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' -import { urlRegex } from 'components/interfaces/Auth/Auth.constants' import EnableExtensionModal from 'components/interfaces/Database/Extensions/EnableExtensionModal' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { getDatabaseCronJob } from 'data/database-cron-jobs/database-cron-job-query' @@ -38,23 +35,22 @@ import { import { Admonition } from 'ui-patterns/admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { CRONJOB_DEFINITIONS } from './CronJobs.constants' +import { CRONJOB_DEFINITIONS } from '../CronJobs.constants' +import { buildCronQuery, buildHttpRequestCommand, parseCronJobCommand } from '../CronJobs.utils' +import { EdgeFunctionSection } from '../EdgeFunctionSection' +import { HttpBodyFieldSection } from '../HttpBodyFieldSection' +import { HTTPHeaderFieldsSection } from '../HttpHeaderFieldsSection' +import { HttpRequestSection } from '../HttpRequestSection' +import { SqlFunctionSection } from '../SqlFunctionSection' +import { SqlSnippetSection } from '../SqlSnippetSection' import { - buildCronQuery, - buildHttpRequestCommand, - cronPattern, - parseCronJobCommand, - secondsPattern, -} from './CronJobs.utils' + FormSchema, + type CreateCronJobForm, + type CronJobType, +} from './CreateCronJobSheet.constants' import { CronJobScheduleSection } from './CronJobScheduleSection' -import { EdgeFunctionSection } from './EdgeFunctionSection' -import { HttpBodyFieldSection } from './HttpBodyFieldSection' -import { HTTPHeaderFieldsSection } from './HttpHeaderFieldsSection' -import { HttpRequestSection } from './HttpRequestSection' -import { SqlFunctionSection } from './SqlFunctionSection' -import { SqlSnippetSection } from './SqlSnippetSection' -export interface CreateCronJobSheetProps { +interface CreateCronJobSheetProps { selectedCronJob?: Pick supportsSeconds: boolean isClosing: boolean @@ -62,113 +58,6 @@ export interface CreateCronJobSheetProps { onClose: () => void } -const edgeFunctionSchema = z.object({ - type: z.literal('edge_function'), - method: z.enum(['GET', 'POST']), - edgeFunctionName: z.string().trim().min(1, 'Please select one of the listed Edge Functions'), - timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), - httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), - httpBody: z - .string() - .trim() - .optional() - .refine((value) => { - if (!value) return true - try { - JSON.parse(value) - return true - } catch { - return false - } - }, 'Input must be valid JSON'), - // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it - snippet: z.string().trim(), -}) - -const httpRequestSchema = z.object({ - type: z.literal('http_request'), - method: z.enum(['GET', 'POST']), - endpoint: z - .string() - .trim() - .min(1, 'Please provide a URL') - .regex(urlRegex(), 'Please provide a valid URL') - .refine((value) => value.startsWith('http'), 'Please include HTTP/HTTPs to your URL'), - timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), - httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), - httpBody: z - .string() - .trim() - .optional() - .refine((value) => { - if (!value) return true - try { - JSON.parse(value) - return true - } catch { - return false - } - }, 'Input must be valid JSON'), - // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it - snippet: z.string().trim(), -}) - -const sqlFunctionSchema = z.object({ - type: z.literal('sql_function'), - schema: z.string().trim().min(1, 'Please select one of the listed database schemas'), - functionName: z.string().trim().min(1, 'Please select one of the listed database functions'), - // When editing a cron job, we want to keep the original command as a snippet in case the user wants to manually edit it - snippet: z.string().trim(), -}) - -const sqlSnippetSchema = z.object({ - type: z.literal('sql_snippet'), - snippet: z.string().trim().min(1), -}) - -const FormSchema = z - .object({ - name: z.string().trim().min(1, 'Please provide a name for your cron job'), - supportsSeconds: z.boolean(), - schedule: z - .string() - .trim() - .min(1) - .refine((value) => { - if (cronPattern.test(value)) { - try { - CronToString(value) - return true - } catch { - return false - } - } else if (secondsPattern.test(value)) { - return true - } - return false - }, 'Invalid Cron format'), - values: z.discriminatedUnion('type', [ - edgeFunctionSchema, - httpRequestSchema, - sqlFunctionSchema, - sqlSnippetSchema, - ]), - }) - .superRefine((data, ctx) => { - if (!cronPattern.test(data.schedule)) { - if (!(data.supportsSeconds && secondsPattern.test(data.schedule))) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Seconds are supported only in pg_cron v1.5.0+. Please use a valid Cron format.', - path: ['schedule'], - }) - } - } - }) - -export type CreateCronJobForm = z.infer -export type CronJobType = CreateCronJobForm['values'] - const FORM_ID = 'create-cron-job-sidepanel' const buildCommand = (values: CronJobType) => { diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobScheduleSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx similarity index 97% rename from apps/studio/components/interfaces/Integrations/CronJobs/CronJobScheduleSection.tsx rename to apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx index eb5ba948104..f911e90b625 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobScheduleSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx @@ -23,9 +23,9 @@ import { Switch, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' -import { CreateCronJobForm } from './CreateCronJobSheet' -import { formatScheduleString, getScheduleMessage } from './CronJobs.utils' -import CronSyntaxChart from './CronSyntaxChart' +import { formatScheduleString, getScheduleMessage } from '../CronJobs.utils' +import CronSyntaxChart from '../CronSyntaxChart' +import { type CreateCronJobForm } from './CreateCronJobSheet.constants' interface CronJobScheduleSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx index 02de19a27d9..eb0622f4430 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx @@ -20,7 +20,7 @@ import { TooltipTrigger, } from 'ui' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' -import { CreateCronJobSheet } from './CreateCronJobSheet' +import { CreateCronJobSheet } from './CreateCronJobSheet/CreateCronJobSheet' import { isSecondsFormat, parseCronJobCommand } from './CronJobs.utils' import { PreviousRunsTab } from './PreviousRunsTab' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx index ea33c32f928..b7017e8684a 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx @@ -1,3 +1,4 @@ +import parser from 'cron-parser' import dayjs from 'dayjs' import { Clipboard, Edit, MoreVertical, Play, Trash } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' @@ -41,7 +42,34 @@ import { TooltipTrigger, } from 'ui' import { TimestampInfo } from 'ui-patterns' -import { getNextRun } from './CronJobs.utils' + +const getNextRun = (schedule: string, lastRun?: string) => { + // cron-parser can only deal with the traditional cron syntax but technically users can also + // use strings like "30 seconds" now, For the latter case, we try our best to parse the next run + // (can't guarantee as scope is quite big) + if (schedule.includes('*')) { + try { + const interval = parser.parseExpression(schedule, { tz: 'UTC' }) + return interval.next().getTime() + } catch (error) { + return undefined + } + } else { + // [Joshen] Only going to attempt to parse if the schedule is as simple as "n second" or "n seconds" + // Returned undefined otherwise - we can revisit this perhaps if we get feedback about this + const [value, unit] = schedule.toLocaleLowerCase().split(' ') + if ( + ['second', 'seconds'].includes(unit) && + !Number.isNaN(Number(value)) && + lastRun !== undefined + ) { + const parsedLastRun = dayjs(lastRun).add(Number(value), unit as dayjs.ManipulateType) + return parsedLastRun.valueOf() + } else { + return undefined + } + } +} interface CronJobTableCellProps { col: any diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.constants.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.constants.tsx index 3399942fd45..c830c8afc9e 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.constants.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.constants.tsx @@ -1,6 +1,12 @@ import { EdgeFunctions, RESTApi, SqlEditor } from 'icons' import { ScrollText } from 'lucide-react' +export const cronPattern = + /^(\*|(\d+|\*\/\d+)|\d+\/\d+|\d+-\d+|\d+(,\d+)*)(\s+(\*|(\d+|\*\/\d+)|\d+\/\d+|\d+-\d+|\d+(,\d+)*)){4}$/ + +// detect seconds like "10 seconds" or normal cron syntax like "*/5 * * * *" +export const secondsPattern = /^\d+\s+seconds*$/ + export const CRONJOB_TYPES = [ 'http_request', 'edge_function', diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts index 08827113b60..75a87094ea6 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest' -import { cronPattern, parseCronJobCommand, secondsPattern } from './CronJobs.utils' +import { cronPattern, secondsPattern } from './CronJobs.constants' +import { parseCronJobCommand } from './CronJobs.utils' describe('parseCronJobCommand', () => { it('should return a default object when the command is null', () => { diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx index c17360b7a0f..926d9990349 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx @@ -1,12 +1,10 @@ -import parser from 'cron-parser' import { toString as CronToString } from 'cronstrue' -import dayjs from 'dayjs' import { Column } from 'react-data-grid' import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' import { cn } from 'ui' -import { CronJobType } from './CreateCronJobSheet' -import { CRON_TABLE_COLUMNS, HTTPHeader } from './CronJobs.constants' +import { CronJobType } from './CreateCronJobSheet/CreateCronJobSheet.constants' +import { CRON_TABLE_COLUMNS, HTTPHeader, secondsPattern } from './CronJobs.constants' import { CronJobTableCell } from './CronJobTableCell' export function buildCronQuery(name: string, schedule: string, command: string) { @@ -186,12 +184,6 @@ export function formatDate(dateString: string): string { return date.toLocaleString(undefined, options) } -export const cronPattern = - /^(\*|(\d+|\*\/\d+)|\d+\/\d+|\d+-\d+|\d+(,\d+)*)(\s+(\*|(\d+|\*\/\d+)|\d+\/\d+|\d+-\d+|\d+(,\d+)*)){4}$/ - -// detect seconds like "10 seconds" or normal cron syntax like "*/5 * * * *" -export const secondsPattern = /^\d+\s+seconds*$/ - export function isSecondsFormat(schedule: string): boolean { return secondsPattern.test(schedule.trim().toLocaleLowerCase()) } @@ -230,44 +222,6 @@ export const formatScheduleString = (value: string) => { } } -export const convertCronToString = (schedule: string) => { - // pg_cron can also use "30 seconds" format for schedule. Cronstrue doesn't understand that format so just use the - // original schedule when cronstrue throws - try { - return CronToString(schedule) - } catch (error) { - return schedule - } -} - -export const getNextRun = (schedule: string, lastRun?: string) => { - // cron-parser can only deal with the traditional cron syntax but technically users can also - // use strings like "30 seconds" now, For the latter case, we try our best to parse the next run - // (can't guarantee as scope is quite big) - if (schedule.includes('*')) { - try { - const interval = parser.parseExpression(schedule, { tz: 'UTC' }) - return interval.next().getTime() - } catch (error) { - return undefined - } - } else { - // [Joshen] Only going to attempt to parse if the schedule is as simple as "n second" or "n seconds" - // Returned undefined otherwise - we can revisit this perhaps if we get feedback about this - const [value, unit] = schedule.toLocaleLowerCase().split(' ') - if ( - ['second', 'seconds'].includes(unit) && - !Number.isNaN(Number(value)) && - lastRun !== undefined - ) { - const parsedLastRun = dayjs(lastRun).add(Number(value), unit as dayjs.ManipulateType) - return parsedLastRun.valueOf() - } else { - return undefined - } - } -} - export const formatCronJobColumns = ({ onSelectEdit, onSelectDelete, diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx index 65fb83d93a4..8a55a9b29e5 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx @@ -5,7 +5,7 @@ import { UIEvent, useMemo, useRef, useState } from 'react' import DataGrid, { DataGridHandle, Row } from 'react-data-grid' import { useParams } from 'common' -import { CreateCronJobSheet } from 'components/interfaces/Integrations/CronJobs/CreateCronJobSheet' +import { CreateCronJobSheet } from 'components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet' import AlertError from 'components/ui/AlertError' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useCronJobsCountQuery } from 'data/database-cron-jobs/database-cron-jobs-count-query' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx index 6883555c086..5a23112951e 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx @@ -21,7 +21,7 @@ import { SheetSection, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HTTPRequestFieldsProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx index efda8511f72..4ba3b23f081 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx @@ -2,7 +2,6 @@ import { UseFormReturn } from 'react-hook-form' import { FormControl_Shadcn_, - FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, @@ -10,7 +9,7 @@ import { SheetSection, TextArea_Shadcn_, } from 'ui' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HttpBodyFieldSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx index 536fd890501..fb4cb999813 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx @@ -19,7 +19,7 @@ import { Input_Shadcn_, SheetSection, } from 'ui' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HTTPHeaderFieldsSectionProps { variant: 'edge_function' | 'http_request' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx index 03d522eb626..3107f0b1258 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx @@ -15,7 +15,7 @@ import { SheetSection, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HttpRequestSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx index ffbbc7d720b..3d25f88e61e 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx @@ -4,7 +4,7 @@ import FunctionSelector from 'components/ui/FunctionSelector' import SchemaSelector from 'components/ui/SchemaSelector' import { FormField_Shadcn_, SheetSection } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface SqlFunctionSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx index 8d3bb465d78..25f14eb141b 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx @@ -3,7 +3,7 @@ import { UseFormReturn } from 'react-hook-form' import CodeEditor from 'components/ui/CodeEditor/CodeEditor' import { FormField_Shadcn_, SheetSection } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { CreateCronJobForm } from './CreateCronJobSheet' +import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface SqlSnippetSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx index b0b738b858e..133bbe9ef66 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx @@ -18,7 +18,7 @@ import { Edit3, Eye, EyeOff, Key, Loader, MoreVertical, Trash } from 'lucide-rea import type { VaultSecret } from 'types' import { Input } from 'ui-patterns/DataInputs/Input' import EditSecretModal from './EditSecretModal' -import type { SecretTableColumn } from './Secrets.utils' +import { SecretTableColumn } from './Secrets.types' interface SecretRowProps { row: VaultSecret diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.types.ts b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.types.ts new file mode 100644 index 00000000000..6cddb9c8291 --- /dev/null +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.types.ts @@ -0,0 +1,7 @@ +export interface SecretTableColumn { + id: 'secret' | 'id' | 'secret_value' | 'updated_at' | 'actions' + name: string + minWidth?: number + width?: number + maxWidth?: number +} diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx index a1bec3a55db..ccb7f07405e 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx @@ -3,16 +3,7 @@ import type { Column } from 'react-data-grid' import type { VaultSecret } from 'types' import { cn } from 'ui' import SecretRow from './SecretRow' - -export type SecretColumnId = 'secret' | 'id' | 'secret_value' | 'updated_at' | 'actions' - -export interface SecretTableColumn { - id: SecretColumnId - name: string - minWidth?: number - width?: number - maxWidth?: number -} +import { SecretTableColumn } from './Secrets.types' export const SECRET_TABLE_COLUMNS: SecretTableColumn[] = [ { id: 'secret', name: 'Secret', minWidth: 300, width: 360 }, diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx index a2c7e0de25e..e3dcb01cd3e 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx @@ -30,6 +30,8 @@ import { WrapperMeta } from './Wrappers.types' import { makeValidateRequired } from './Wrappers.utils' import WrapperTableEditor from './WrapperTableEditor' +const FORM_ID = 'create-wrapper-form' + export interface CreateWrapperSheetProps { isClosing: boolean wrapperMeta: WrapperMeta @@ -37,8 +39,6 @@ export interface CreateWrapperSheetProps { onClose: () => void } -const FORM_ID = 'create-wrapper-form' - export const CreateWrapperSheet = ({ wrapperMeta, isClosing, diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx index 6d422b8dfe8..14ccc25b99d 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx @@ -18,6 +18,7 @@ import { WarningIcon, } from 'ui' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' +import { CreateIcebergWrapperSheet } from './CreateIcebergWrapperSheet' import { CreateWrapperSheet } from './CreateWrapperSheet' import { WRAPPERS } from './Wrappers.constants' import { WrapperTable } from './WrapperTable' @@ -53,7 +54,13 @@ export const WrapperOverviewTab = () => { const databaseNeedsUpgrading = wrappersExtension?.installed_version === wrappersExtension?.default_version - const CreateWrapperSheetComponent = wrapperMeta.createComponent || CreateWrapperSheet + // [Joshen] Opting to declare custom wrapper sheets here instead of within Wrappers.constants.ts + // as we'll easily run into circular dependencies doing so unfortunately + const CreateWrapperSheetComponent = wrapperMeta.customComponent + ? wrapperMeta.name === 'iceberg_wrapper' + ? CreateIcebergWrapperSheet + : ({}) => null + : CreateWrapperSheet return ( + customComponent?: boolean // If true, the wrapper can target a schema which will be populated with tables specified by the wrapper.. canTargetSchema?: boolean sourceSchemaOption?: ServerOption diff --git a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx index 92b454ebc25..a6e644ce8b8 100644 --- a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx +++ b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx @@ -3,8 +3,9 @@ import { useParams } from 'common' import dayjs from 'dayjs' import { ArrowDown, ArrowUp, RefreshCw, User } from 'lucide-react' import Image from 'next/legacy/image' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' +import { useDebounce } from '@uidotdev/usehooks' import { LogDetailsPanel } from 'components/interfaces/AuditLogs' import { LogsDatePicker } from 'components/interfaces/Settings/Logs/Logs.DatePickers' import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' @@ -22,7 +23,7 @@ import { } from 'data/organizations/organization-audit-logs-query' import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProjectsQuery } from 'data/projects/projects-query' +import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { AlertDescription_Shadcn_, @@ -43,6 +44,7 @@ const logsUpgradeError = 'upgrade to Team or Enterprise Plan to access audit log export const AuditLogs = () => { const { slug } = useParams() const currentTime = dayjs().utc().set('millisecond', 0) + const [dateSortDesc, setDateSortDesc] = useState(true) const [dateRange, setDateRange] = useState({ from: currentTime.subtract(1, 'day').toISOString(), @@ -54,16 +56,14 @@ export const AuditLogs = () => { projects: [], // project_ref[] }) + const [search, setSearch] = useState('') + const debouncedSearch = useDebounce(search, 500) + const { can: canReadAuditLogs, isLoading: isLoadingPermissions } = useAsyncCheckPermissions( PermissionAction.READ, 'notifications' ) - const { data: projectsData } = useProjectsQuery() - const projects = projectsData?.projects ?? [] - const { data: organizations } = useOrganizationsQuery() - const { data: members } = useOrganizationMembersQuery({ slug }) - const { data: rolesData } = useOrganizationRolesV2Query({ slug }) const { data, error, isLoading, isSuccess, isError, isRefetching, refetch } = useOrganizationAuditLogsQuery( { @@ -79,9 +79,31 @@ export const AuditLogs = () => { }, } ) + const isLogsNotAvailableBasedOnPlan = isError && error.message.endsWith(logsUpgradeError) + const isRangeExceededError = isError && error.message.includes('range exceeded') + const showFilters = !isLoading && !isLogsNotAvailableBasedOnPlan + + const { + data: projectsData, + isLoading: isLoadingProjects, + isFetching, + isFetchingNextPage, + hasNextPage, + fetchNextPage, + } = useOrgProjectsInfiniteQuery( + { slug, search: search.length === 0 ? search : debouncedSearch }, + { keepPreviousData: true, enabled: showFilters } + ) + const { data: organizations } = useOrganizationsQuery({ + enabled: showFilters, + }) + const { data: members } = useOrganizationMembersQuery({ slug }, { enabled: showFilters }) + const { data: rolesData } = useOrganizationRolesV2Query({ slug }, { enabled: showFilters }) const activeMembers = (members ?? []).filter((x) => !x.invited_at) const roles = [...(rolesData?.org_scoped_roles ?? []), ...(rolesData?.project_scoped_roles ?? [])] + const projects = + useMemo(() => projectsData?.pages.flatMap((page) => page.projects), [projectsData?.pages]) || [] const logs = data?.result ?? [] const sortedLogs = logs @@ -105,8 +127,6 @@ export const AuditLogs = () => { } }) - const currentOrganization = organizations?.find((o) => o.slug === slug) - // This feature depends on the subscription tier of the user. Free user can view logs up to 1 day // in the past. The API limits the logs to maximum of 1 day and 5 minutes so when the page is // viewed for more than 5 minutes, the call parameters needs to be updated. This also works with @@ -124,81 +144,122 @@ export const AuditLogs = () => { return () => clearInterval(interval) }, [dateRange.from, dateRange.to]) + if (isLogsNotAvailableBasedOnPlan) { + return ( + + + + +
    +
    + + Organization Audit Logs are not available on Free or Pro plans + + +

    + Upgrade to Team or Enterprise to view up to 28 days of Audit Logs for your + organization. +

    +
    +
    + +
    + + Upgrade subscription + +
    +
    +
    +
    +
    + ) + } + return ( <>
    -
    -
    -

    Filter by

    - setFilters({ ...filters, users: values })} - /> - p.organization_id === currentOrganization?.id) ?? [] - } - labelKey="name" - valueKey="ref" - activeOptions={filters.projects} - onSaveFilters={(values) => setFilters({ ...filters, projects: values })} - /> - setDateRange(value)} - helpers={[ - { - text: 'Last 1 hour', - calcFrom: () => dayjs().subtract(1, 'hour').toISOString(), - calcTo: () => dayjs().toISOString(), - }, - { - text: 'Last 3 hours', - calcFrom: () => dayjs().subtract(3, 'hour').toISOString(), - calcTo: () => dayjs().toISOString(), - }, + {showFilters && ( +
    +
    +

    Filter by

    + setFilters({ ...filters, users: values })} + /> + setFilters({ ...filters, projects: values })} + search={search} + setSearch={setSearch} + hasNextPage={hasNextPage} + isLoading={isLoadingProjects} + isFetching={isFetching} + isFetchingNextPage={isFetchingNextPage} + fetchNextPage={fetchNextPage} + /> + setDateRange(value)} + helpers={[ + { + text: 'Last 1 hour', + calcFrom: () => dayjs().subtract(1, 'hour').toISOString(), + calcTo: () => dayjs().toISOString(), + }, + { + text: 'Last 3 hours', + calcFrom: () => dayjs().subtract(3, 'hour').toISOString(), + calcTo: () => dayjs().toISOString(), + }, - { - text: 'Last 6 hours', - calcFrom: () => dayjs().subtract(6, 'hour').toISOString(), - calcTo: () => dayjs().toISOString(), - }, - { - text: 'Last 12 hours', - calcFrom: () => dayjs().subtract(12, 'hour').toISOString(), - calcTo: () => dayjs().toISOString(), - }, - { - text: 'Last 24 hours', - calcFrom: () => dayjs().subtract(1, 'day').toISOString(), - calcTo: () => dayjs().toISOString(), - }, - ]} - /> - {isSuccess && ( - <> -
    -

    Viewing {sortedLogs.length} logs in total

    - - )} + { + text: 'Last 6 hours', + calcFrom: () => dayjs().subtract(6, 'hour').toISOString(), + calcTo: () => dayjs().toISOString(), + }, + { + text: 'Last 12 hours', + calcFrom: () => dayjs().subtract(12, 'hour').toISOString(), + calcTo: () => dayjs().toISOString(), + }, + { + text: 'Last 24 hours', + calcFrom: () => dayjs().subtract(1, 'day').toISOString(), + calcTo: () => dayjs().toISOString(), + }, + ]} + /> + {isSuccess && ( + <> +
    +

    Viewing {sortedLogs.length} logs in total

    + + )} +
    +
    - -
    + )} {isLoading || isLoadingPermissions ? (
    @@ -210,34 +271,8 @@ export const AuditLogs = () => { ) : null} - {isError ? ( - error.message.endsWith(logsUpgradeError) ? ( - - -
    -
    - - Organization Audit Logs are not available on Free or Pro plans - - -

    - Upgrade to Team or Enterprise to view up to 28 days of Audit Logs for your - organization. -

    -
    -
    - -
    - - Upgrade subscription - -
    -
    -
    - ) : error.message.includes('range exceeded') ? ( + {isError && + (isRangeExceededError ? ( Date range too large @@ -248,8 +283,7 @@ export const AuditLogs = () => { ) : ( - ) - ) : null} + ))} {isSuccess && ( <> diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx index 9bbcfec1b4c..29019e4f2b5 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx @@ -71,22 +71,24 @@ const BillingBreakdown = () => {

    {selectedOrganization?.managed_by === MANAGED_BY.AWS_MARKETPLACE ? ( <> - You'll receive two invoices from AWS Marketplace: one on the 3rd of{' '} - {billingCycleEnd.format('MMMM')} for your usage in{' '} - {billingCycleStart.format('MMMM')} and one on {billingCycleEnd.format('MMMM DD')}{' '} - for the fixed subscription fee. +

    + AWS Marketplace sends two invoices each month: one for your fixed subscription + fee, billed on the day you subscribed, and one for your usage charges from the + previous month, billed by the 3rd. +

    + +

    + For a more detailed breakdown, visit the{' '} + usage page. +

    ) : ( <> Your upcoming invoice (excluding credits) will continue to update until the end of - your billing cycle on {billingCycleEnd.format('MMMM DD')}. + your billing cycle on {billingCycleEnd.format('MMMM DD')}. For a more detailed + breakdown, visit the usage page. )} - <> - {' '} - For a more detailed breakdown, visit the{' '} - usage page. -


    diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx index 884b39bee9e..bcb1c3f0f0b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx @@ -57,7 +57,7 @@ export const BillingSettings = () => { - {org?.plan.id !== 'free' && ( + {org && org.plan.id !== 'free' && ( diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx index bfc48ccab37..3da418ea629 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx @@ -55,7 +55,9 @@ const CreditBalance = () => { {isPermissionsLoaded && !canReadSubscriptions ? ( ) : ( - }> + } + > {isError && ( diff --git a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx index 0e3c77246e9..f9cb258318c 100644 --- a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx +++ b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx @@ -3,7 +3,7 @@ import Link from 'next/link' import { useIsMFAEnabled } from 'common' import { ActionCard } from 'components/ui/ActionCard' -import { useProjectsQuery } from 'data/projects/projects-query' +import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import { Organization } from 'types' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' @@ -15,10 +15,8 @@ export const OrganizationCard = ({ href?: string }) => { const isUserMFAEnabled = useIsMFAEnabled() - const { data } = useProjectsQuery() - const allProjects = data?.projects ?? [] - - const numProjects = allProjects.filter((x) => x.organization_slug === organization.slug).length + const { data } = useOrgProjectsInfiniteQuery({ slug: organization.slug }) + const numProjects = data?.pages[0].pagination.count ?? 0 const isMfaRequired = organization.organization_requires_mfa return ( diff --git a/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx b/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx index 7bd3b6df393..98a38c1b195 100644 --- a/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx +++ b/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx @@ -157,7 +157,7 @@ export const SSOConfig = () => { return ( - + {!!plan && !canSetupSSOConfig ? ( { Usage -

    +
    {isLoadingSubscription || isLoadingPermissions ? ( diff --git a/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx new file mode 100644 index 00000000000..de4bd3abaed --- /dev/null +++ b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx @@ -0,0 +1,61 @@ +import { useState, useEffect } from 'react' +import { motion } from 'framer-motion' +import { MousePointer2 } from 'lucide-react' + +export const AnimatedCursors = () => { + const [cursor1Position, setCursor1Position] = useState({ x: 20, y: 20 }) + const [cursor2Position, setCursor2Position] = useState({ x: 180, y: 80 }) + + useEffect(() => { + const animateCursors = () => { + const newCursor1Position = { + x: Math.random() * 160 + 20, + y: Math.random() * 80 + 20, + } + const newCursor2Position = { + x: Math.random() * 160 + 20, + y: Math.random() * 80 + 20, + } + + setCursor1Position(newCursor1Position) + setCursor2Position(newCursor2Position) + } + + const initialTimer = setTimeout(animateCursors, 1000) + + const interval = setInterval(animateCursors, 3000) + + return () => { + clearTimeout(initialTimer) + clearInterval(interval) + } + }, []) + + return ( +
    + + + + + + +
    + ) +} diff --git a/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx b/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx new file mode 100644 index 00000000000..8bed6a1596c --- /dev/null +++ b/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx @@ -0,0 +1,101 @@ +import { AiIconAnimation, Button, Card, cn } from 'ui' +import Link from 'next/link' +import { AnimatedCursors } from './AnimatedCursors' +import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' + +/** + * Acts as a container component for the entire log display + */ +export const EmptyRealtime = ({ projectRef }: { projectRef: string }) => { + const aiSnap = useAiAssistantStateSnapshot() + + const handleCreateTriggerWithAssistant = () => { + aiSnap.newChat({ + name: `Realtime`, + open: true, + initialInput: `Help me set up a realtime experience for my project`, + }) + } + + return ( +
    +
    +
    + +

    Create realtime experiences

    +

    + Send your first realtime message from your database, application code or edge function +

    + +
    + + +
    +
    + + 1 + +

    Broadcast messages

    +
    +

    + Send messages to a channel from your client application or database via triggers. +

    + +
    + +
    +
    + + 2 + +

    Write policies

    +
    +

    + Set up Row Level Security policies to control who can see messages within a channel +

    + +
    + +
    +
    + + 3 + +

    Subscribe to a channel

    +
    +

    + Receive realtime messages in your application by listening to a channel +

    + +
    +
    +
    +
    + ) +} diff --git a/apps/studio/components/interfaces/Realtime/Inspector/index.tsx b/apps/studio/components/interfaces/Realtime/Inspector/index.tsx index 28b616b7735..116ce210093 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/index.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/index.tsx @@ -1,5 +1,7 @@ import { useParams } from 'common' -import { useState } from 'react' +import { useState, useEffect } from 'react' +import { motion } from 'framer-motion' +import { MousePointer2 } from 'lucide-react' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' @@ -7,6 +9,7 @@ import { Header } from './Header' import MessagesTable from './MessagesTable' import { SendMessageModal } from './SendMessageModal' import { RealtimeConfig, useRealtimeMessages } from './useRealtimeMessages' +import { EmptyRealtime } from './EmptyRealtime' /** * Acts as a container component for the entire log display @@ -40,12 +43,16 @@ export const RealtimeInspector = () => {
    - 0} - enabled={realtimeConfig.enabled} - data={logData} - showSendMessage={() => setSendMessageShown(true)} - /> + {(logData ?? []).length > 0 ? ( + 0} + enabled={realtimeConfig.enabled} + data={logData} + showSendMessage={() => setSendMessageShown(true)} + /> + ) : ( + + )}
    diff --git a/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx b/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx index 779aa17ee33..d5bd366bf00 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx @@ -1,8 +1,7 @@ +import { LogChartHandler } from 'components/ui/Charts/LogChartHandler' import Link from 'next/link' import { useRef, useState } from 'react' -import { LogChartHandler } from 'components/ui/Charts/LogChartHandler' -import { ReportConfig } from 'data/reports/v2/reports.types' import { Button, Card, cn } from 'ui' export function ReportChartUpsell({ @@ -78,7 +77,6 @@ export function ReportChartUpsell({ label={''} startDate={startDate} endDate={endDate} - interval={'1d'} data={demoData as any} isLoading={false} highlightedValue={0} diff --git a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx index 33fddb3c71e..7b59187c6d7 100644 --- a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx +++ b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx @@ -55,7 +55,7 @@ import { HardenAPIModal } from './HardenAPIModal' const formSchema = z .object({ dbSchema: z.array(z.string()), - dbExtraSearchPath: z.string(), + dbExtraSearchPath: z.array(z.string()), maxRows: z.number().max(1000000, "Can't be more than 1,000,000"), dbPool: z .number() @@ -84,15 +84,26 @@ export const PostgrestConfig = () => { const [showModal, setShowModal] = useState(false) - const { data: config, isError, isLoading } = useProjectPostgrestConfigQuery({ projectRef }) + const { + data: config, + isError, + isLoading: isLoadingConfig, + } = useProjectPostgrestConfigQuery({ projectRef }) const { data: extensions } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) - const { data: schemas, isLoading: isLoadingSchemas } = useSchemasQuery({ + const { + data: allSchemas = [], + isLoading: isLoadingSchemas, + isSuccess: isSuccessSchemas, + } = useSchemasQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) + + const isLoading = isLoadingConfig || isLoadingSchemas + const { mutate: updatePostgrestConfig, isLoading: isUpdating } = useProjectPostgrestConfigUpdateMutation({ onSuccess: () => { @@ -112,7 +123,10 @@ export const PostgrestConfig = () => { const defaultValues = { dbSchema, maxRows: config?.max_rows, - dbExtraSearchPath: config?.db_extra_search_path, + dbExtraSearchPath: (config?.db_extra_search_path ?? '') + .split(',') + .map((x) => x.trim()) + .filter((x) => x.length > 0 && allSchemas.find((y) => y.name === x)), dbPool: config?.db_pool, } @@ -122,9 +136,9 @@ export const PostgrestConfig = () => { defaultValues, }) - const schema = - schemas - ?.filter((x) => { + const schemas = + allSchemas + .filter((x) => { const find = indexOf(hiddenSchema, x.name) if (find < 0) return x }) @@ -149,20 +163,20 @@ export const PostgrestConfig = () => { projectRef, dbSchema: values.dbSchema.join(', '), maxRows: values.maxRows, - dbExtraSearchPath: values.dbExtraSearchPath, + dbExtraSearchPath: values.dbExtraSearchPath.join(','), dbPool: values.dbPool ? values.dbPool : null, }) } useEffect(() => { - if (config) { + if (config && isSuccessSchemas) { /** * Checks if enableDataApi should be enabled or disabled * based on the db_schema value being empty string */ resetForm() } - }, [config]) + }, [config, isSuccessSchemas]) const isDataApiEnabledInForm = form.getValues('enableDataApi') @@ -277,21 +291,16 @@ export const PostgrestConfig = () => { /> - {schema.length <= 0 ? ( + {schemas.length <= 0 ? ( no ) : ( - <> - {schema.map((x) => ( - - {x.name} - - ))} - + schemas.map((x) => ( + + {x.name} + + )) )} @@ -341,15 +350,43 @@ export const PostgrestConfig = () => { className="w-full px-8 py-8" layout="horizontal" label="Extra search path" - description="Extra schemas to add to the search path of every request. Multiple schemas must be comma-separated." + description="Extra schemas to add to the search path of every request." > - - + +
    + ) : ( + - + > + + + + {allSchemas.length <= 0 ? ( + + no + + ) : ( + allSchemas.map((x) => ( + + {x.name} + + )) + )} + + + + )} )} diff --git a/apps/studio/components/interfaces/Settings/API/ServiceList.tsx b/apps/studio/components/interfaces/Settings/API/ServiceList.tsx index 34145807e93..2b16008778b 100644 --- a/apps/studio/components/interfaces/Settings/API/ServiceList.tsx +++ b/apps/studio/components/interfaces/Settings/API/ServiceList.tsx @@ -3,7 +3,6 @@ import { AlertCircle } from 'lucide-react' import { useParams } from 'common' import { ScaffoldSection } from 'components/layouts/Scaffold' import DatabaseSelector from 'components/ui/DatabaseSelector' -import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' @@ -13,6 +12,7 @@ import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Alert_Shadcn_, AlertTitle_Shadcn_, Badge, Card, CardContent, CardHeader } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' +import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import { PostgrestConfig } from './PostgrestConfig' export const ServiceList = () => { @@ -65,7 +65,10 @@ export const ServiceList = () => { {isLoading || isLoadingDatabases ? ( - +
    + + +
    ) : isError ? ( diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx index ff61476ee0c..f3ee01982a2 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx @@ -5,7 +5,10 @@ import { useFlag, useParams } from 'common' import { FormHeader } from 'components/ui/Forms/FormHeader' import Panel from 'components/ui/Panel' import UpgradeToPro from 'components/ui/UpgradeToPro' -import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' +import { + type CustomDomainsData, + useCustomDomainsQuery, +} from 'data/custom-domains/custom-domains-query' import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import CustomDomainActivate from './CustomDomainActivate' @@ -14,7 +17,7 @@ import CustomDomainVerify from './CustomDomainVerify' import CustomDomainsConfigureHostname from './CustomDomainsConfigureHostname' import CustomDomainsShimmerLoader from './CustomDomainsShimmerLoader' -const CustomDomainConfig = () => { +export const CustomDomainConfig = () => { const { ref } = useParams() const { data: organization } = useSelectedOrganizationQuery() @@ -30,6 +33,7 @@ const CustomDomainConfig = () => { isLoading: isCustomDomainsLoading, isError, isSuccess, + status: customDomainStatus, } = useCustomDomainsQuery( { projectRef: ref }, { @@ -44,7 +48,7 @@ const CustomDomainConfig = () => { } ) - const { status, customDomain } = customDomainData || {} + const { status } = customDomainData || {} return (
    @@ -99,7 +103,7 @@ const CustomDomainConfig = () => { ) : ( - {isSuccess && ( + {isSuccess ? (
    {(status === '1_not_started' || status === '2_initiated' || @@ -116,6 +120,11 @@ const CustomDomainConfig = () => { )}
    + ) : ( + )}
    )} @@ -123,4 +132,15 @@ const CustomDomainConfig = () => { ) } -export default CustomDomainConfig +interface CustomDomainConfigFallthroughProps { + fetchStatus: 'error' | 'success' | 'loading' + data: CustomDomainsData | undefined +} + +function CustomDomainConfigFallthrough({ fetchStatus, data }: CustomDomainConfigFallthroughProps) { + console.error(`Failing to display UI for custom domains: +Fetch status: ${fetchStatus} +Custom domain status: ${data?.status}`) + + return null +} diff --git a/apps/studio/components/interfaces/Settings/General/index.ts b/apps/studio/components/interfaces/Settings/General/index.ts index a211542638e..daebfc2f9e4 100644 --- a/apps/studio/components/interfaces/Settings/General/index.ts +++ b/apps/studio/components/interfaces/Settings/General/index.ts @@ -1,5 +1,5 @@ export { default as ComplianceConfig } from './ComplianceConfig/ProjectComplianceMode' -export { default as CustomDomainConfig } from './CustomDomainConfig/CustomDomainConfig' +export { CustomDomainConfig } from './CustomDomainConfig/CustomDomainConfig' export { default as DeleteProjectButton } from './DeleteProjectPanel/DeleteProjectButton' export { default as General } from './General' export { default as TransferProjectButton } from './TransferProjectPanel/TransferProjectButton' diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx index 1ff808b8614..343fbc73e6a 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx @@ -95,7 +95,7 @@ const InfrastructureInfo = () => {

    Service Versions

    - Information on your provisioned instance. + Service versions and upgrade eligibility for your provisioned instance.

    diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx index 1e147771370..81874dbe478 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx @@ -24,36 +24,37 @@ export const ObjectsToBeDroppedWarning = ({ }: { objectsToBeDropped: string[] }) => { + const { ref } = useParams() return ( - - A new version of Postgres is available + + A newer version of Postgres is available -
    -

    The following objects have to be removed before upgrading:

    + <> +

    + The following objects are not supported and must be removed before upgrading.{' '} + + Learn more + +

    -
      + {/* Old */} +
        {objectsToBeDropped.map((obj) => (
      • {obj}
      • ))}
      -
    -

    Check the docs for which objects need to be removed.

    -
    - -
    +
    ) @@ -73,15 +74,15 @@ export const UnsupportedExtensionsWarning = ({ <>

    The following extensions are not supported in newer versions of Postgres and must be - removed before you can upgrade.{' '} + removed before upgrading.{' '} Learn more - .

      @@ -107,15 +108,13 @@ export const UnsupportedExtensionsWarning = ({ export const UserDefinedObjectsInInternalSchemasWarning = ({ objects }: { objects: string[] }) => { return ( - - A new version of Postgres is available + + A newer version of Postgres is available

      - You'll need to move these objects out of auth/realtime/storage schemas before upgrading: + The following objects must be removed from the auth/realtime/storage schemas before + upgrading:

        diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts index 1d61aeefbce..8f26529dc49 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -640,7 +640,7 @@ function getErrorCondition(table: LogsTableName): string { case 'postgres_logs': return "parsed.error_severity IN ('ERROR', 'FATAL', 'PANIC')" case 'auth_logs': - return "metadata.level = 'error' OR metadata.status >= 400" + return "metadata.level = 'error' OR SAFE_CAST(metadata.status AS INT64) >= 400" case 'function_edge_logs': return 'response.status_code >= 500' case 'function_logs': diff --git a/apps/studio/components/interfaces/Sidebar.tsx b/apps/studio/components/interfaces/Sidebar.tsx index 63c0ee2600e..72eea15c4c9 100644 --- a/apps/studio/components/interfaces/Sidebar.tsx +++ b/apps/studio/components/interfaces/Sidebar.tsx @@ -46,6 +46,7 @@ import { useIsNewStorageUIEnabled, useUnifiedLogsPreview, } from './App/FeaturePreview/FeaturePreviewContext' +import { useFlag } from 'common' export const ICON_SIZE = 32 export const ICON_STROKE_WIDTH = 1.5 @@ -244,12 +245,15 @@ const ProjectLinks = () => { 'realtime:all', ]) + const authOverviewPageEnabled = useFlag('authOverviewPage') + const toolRoutes = generateToolRoutes(ref, project) const productRoutes = generateProductRoutes(ref, project, { auth: authEnabled, edgeFunctions: edgeFunctionsEnabled, storage: storageEnabled, realtime: realtimeEnabled, + authOverviewPage: authOverviewPageEnabled, isStorageV2, }) const otherRoutes = generateOtherRoutes(ref, project, { diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets.tsx new file mode 100644 index 00000000000..2da65106257 --- /dev/null +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets.tsx @@ -0,0 +1,6 @@ +import { EmptyBucketState } from './EmptyBucketState' + +export const AnalyticsBuckets = () => { + // Placeholder component - will be implemented in a later PR + return +} diff --git a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx index f1f8bdf3053..2586ce15220 100644 --- a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx @@ -1,7 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { snakeCase } from 'lodash' -import { Edit } from 'lucide-react' +import { Plus } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -51,6 +51,7 @@ import { } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { useIsNewStorageUIEnabled } from '../App/FeaturePreview/FeaturePreviewContext' import { inverseValidBucketNameRegex, validBucketNameRegex } from './CreateBucketModal.utils' import { convertFromBytes, convertToBytes } from './StorageSettings/StorageSettings.utils' @@ -95,10 +96,23 @@ const formId = 'create-storage-bucket-form' export type CreateBucketForm = z.infer -export const CreateBucketModal = () => { +interface CreateBucketModalProps { + buttonSize?: 'tiny' | 'small' + buttonType?: 'default' | 'primary' + buttonClassName?: string + label?: string +} + +export const CreateBucketModal = ({ + buttonSize = 'tiny', + buttonType = 'default', + buttonClassName, + label = 'New bucket', +}: CreateBucketModalProps) => { const router = useRouter() const { ref } = useParams() const { data: org } = useSelectedOrganizationQuery() + const isStorageV2 = useIsNewStorageUIEnabled() const [visible, setVisible] = useState(false) const [selectedUnit, setSelectedUnit] = useState(StorageSizeUnits.MB) @@ -189,7 +203,7 @@ export const CreateBucketModal = () => { setSelectedUnit(StorageSizeUnits.MB) setVisible(false) - router.push(`/project/${ref}/storage/buckets/${values.name}`) + if (!isStorageV2) router.push(`/project/${ref}/storage/buckets/${values.name}`) } catch (error: any) { // Handle specific error cases for inline display const errorMessage = error.message?.toLowerCase() || '' @@ -228,8 +242,10 @@ export const CreateBucketModal = () => { } + size={buttonSize} + type={buttonType} + className={buttonClassName} + icon={} disabled={!canCreateBuckets} style={{ justifyContent: 'start' }} onClick={() => setVisible(true)} @@ -242,7 +258,7 @@ export const CreateBucketModal = () => { }, }} > - New bucket + {label} @@ -281,59 +297,61 @@ export const CreateBucketModal = () => { )} /> - ( - - - field.onChange(v)} - > - - {IS_PLATFORM && ( + {!isStorageV2 && ( + ( + + + field.onChange(v)} + > - <> -

        - Stores Iceberg files and is optimized for analytical workloads. -

        + /> + {IS_PLATFORM && ( + + <> +

        + Stores Iceberg files and is optimized for analytical workloads. +

        - {icebergCatalogEnabled ? null : ( -
        - - - This feature is currently in alpha and not yet enabled for your - project. Sign up{' '} - - here - - . - -
        - )} - -
        - )} -
        -
        -
        - )} - /> + {icebergCatalogEnabled ? null : ( +
        + + + This feature is currently in alpha and not yet enabled for + your project. Sign up{' '} + + here + + . + +
        + )} + +
        + )} +
        +
        +
        + )} + /> + )} diff --git a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx index 3b3416834a9..597ae9ea7c5 100644 --- a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx @@ -35,7 +35,7 @@ export const EmptyBucketModal = ({ visible, bucket, onClose }: EmptyBucketModalP folderName: bucket.name, index: -1, }) - toast.success(`Successfully deleted bucket ${bucket!.name}`) + toast.success(`Successfully emptied bucket ${bucket!.name}`) onClose() }, }) diff --git a/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx b/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx new file mode 100644 index 00000000000..3b4e1a61a65 --- /dev/null +++ b/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx @@ -0,0 +1,25 @@ +import { CreateBucketModal } from './CreateBucketModal' +import { BUCKET_TYPES } from './Storage.constants' + +interface EmptyBucketStateProps { + bucketType: keyof typeof BUCKET_TYPES +} + +export const EmptyBucketState = ({ bucketType }: EmptyBucketStateProps) => { + const config = BUCKET_TYPES[bucketType] + + return ( + + ) +} diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets.tsx new file mode 100644 index 00000000000..acd46b2c4b2 --- /dev/null +++ b/apps/studio/components/interfaces/Storage/FilesBuckets.tsx @@ -0,0 +1,239 @@ +import { Edit, FolderOpen, MoreVertical, Search, Trash2 } from 'lucide-react' +import Link from 'next/link' +import { useRouter } from 'next/router' +import { useState } from 'react' + +import { useParams } from 'common' +import { ScaffoldSection } from 'components/layouts/Scaffold' +import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' +import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' +import { Bucket, useBucketsQuery } from 'data/storage/buckets-query' +import { useStoragePolicyCounts } from 'hooks/storage/useStoragePolicyCounts' +import { IS_PLATFORM } from 'lib/constants' +import { formatBytes } from 'lib/helpers' +import { + Badge, + Button, + Card, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from 'ui' +import { Input } from 'ui-patterns/DataInputs/Input' +import { CreateBucketModal } from './CreateBucketModal' +import { DeleteBucketModal } from './DeleteBucketModal' +import { EditBucketModal } from './EditBucketModal' +import { EmptyBucketModal } from './EmptyBucketModal' +import { EmptyBucketState } from './EmptyBucketState' + +export const FilesBuckets = () => { + const router = useRouter() + const { ref } = useParams() + + const [modal, setModal] = useState<'edit' | 'empty' | 'delete' | null>(null) + const [selectedBucket, setSelectedBucket] = useState() + const [filterString, setFilterString] = useState('') + + const { data } = useProjectStorageConfigQuery({ projectRef: ref }, { enabled: IS_PLATFORM }) + const { data: buckets = [], isLoading: isLoadingBuckets } = useBucketsQuery({ projectRef: ref }) + const { getPolicyCount, isLoading: isLoadingPolicies } = useStoragePolicyCounts(buckets) + + const formattedGlobalUploadLimit = formatBytes(data?.fileSizeLimit ?? 0) + + const isLoading = isLoadingBuckets || isLoadingPolicies + const filesBuckets = buckets + .filter((bucket) => !('type' in bucket) || bucket.type === 'STANDARD') + .filter((bucket) => + filterString.length === 0 + ? true + : bucket.name.toLowerCase().includes(filterString.toLowerCase()) + ) + return ( + <> + {!isLoading && + buckets.filter((bucket) => !('type' in bucket) || bucket.type === 'STANDARD').length === 0 ? ( + + ) : ( + +
        + setFilterString(e.target.value)} + icon={} + /> + +
        + + {isLoading ? ( + + ) : ( + + + + + Name + Policies + File size limit + Allowed MIME types + + + + + {filesBuckets.length === 0 && filterString.length > 0 && ( + + +

        No results found

        +

        + Your search for "{filterString}" did not return any results +

        +
        +
        + )} + {filesBuckets.map((bucket) => ( + { + const url = `/project/${ref}/storage/files/buckets/${bucket.id}` + if (event.metaKey) window.open(url, '_blank') + else router.push(url) + }} + > + +
        +

        {bucket.name}

        + {bucket.public && Public} +
        +
        + + +

        {getPolicyCount(bucket.name)}

        +
        + + +

        + {bucket.file_size_limit + ? formatBytes(bucket.file_size_limit) + : `Unset (${formattedGlobalUploadLimit})`} +

        +
        + + +

        + {bucket.allowed_mime_types ? bucket.allowed_mime_types.join(', ') : 'Any'} +

        +
        + + +
        + + + +
        +
        +
        + ))} +
        +
        +
        + )} +
        + )} + + {selectedBucket && ( + <> + setModal(null)} + /> + setModal(null)} + /> + setModal(null)} + /> + + )} + + ) +} diff --git a/apps/studio/components/interfaces/Storage/Storage.constants.ts b/apps/studio/components/interfaces/Storage/Storage.constants.ts index 9dc6cae7b37..b2c75e211ac 100644 --- a/apps/studio/components/interfaces/Storage/Storage.constants.ts +++ b/apps/studio/components/interfaces/Storage/Storage.constants.ts @@ -65,20 +65,25 @@ export const CONTEXT_MENU_KEYS = { export const BUCKET_TYPES = { files: { displayName: 'Files', + label: 'a file bucket', description: 'General file storage for most types of digital content.', + valueProp: 'Store images, videos, documents, and any other file type.', docsUrl: `${DOCS_URL}/guides/storage/buckets/fundamentals`, }, analytics: { displayName: 'Analytics', + label: 'an analytics bucket', description: 'Purpose-built storage for analytical workloads.', + valueProp: 'Store large datasets for analytics and reporting.', docsUrl: `${DOCS_URL}/guides/storage/analytics/introduction`, }, vectors: { displayName: 'Vectors', + label: 'a vector bucket', description: 'Purpose-built storage for vector data.', + valueProp: 'Store, index, and query your vector embeddings at scale.', docsUrl: `${DOCS_URL}/guides/storage/vectors`, }, } - export const BUCKET_TYPE_KEYS = Object.keys(BUCKET_TYPES) as Array export const DEFAULT_BUCKET_TYPE: keyof typeof BUCKET_TYPES = 'files' diff --git a/apps/studio/components/interfaces/Storage/Storage.utils.ts b/apps/studio/components/interfaces/Storage/Storage.utils.ts index 36f64ef075f..51254750652 100644 --- a/apps/studio/components/interfaces/Storage/Storage.utils.ts +++ b/apps/studio/components/interfaces/Storage/Storage.utils.ts @@ -1,4 +1,6 @@ -import { groupBy, difference } from 'lodash' +import { difference, groupBy } from 'lodash' +import { useRouter } from 'next/router' + import { STORAGE_CLIENT_LIBRARY_MAPPINGS } from './Storage.constants' import type { StoragePolicyFormField } from './Storage.types' @@ -188,3 +190,8 @@ export const createSQLPolicies = ( export const applyBucketIdToTemplateDefinition = (definition: string, bucketId: any) => { return definition.replace('{bucket_id}', `'${bucketId}'`) } + +export const useStorageV2Page = () => { + const router = useRouter() + return router.pathname.split('/')[4] as undefined | 'files' | 'analytics' | 'vectors' | 's3' +} diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx index 72135eb819e..7025cf213cd 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -16,7 +16,10 @@ import { } from 'lucide-react' import { useCallback, useEffect, useRef, useState } from 'react' -import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { + useIsAPIDocsSidePanelEnabled, + useIsNewStorageUIEnabled, +} from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { APIDocsButton } from 'components/ui/APIDocsButton' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' @@ -148,6 +151,7 @@ export const FileExplorerHeader = ({ const debounceDuration = 300 const snap = useStorageExplorerStateSnapshot() const isNewAPIDocsEnabled = useIsAPIDocsSidePanelEnabled() + const isNewStorageUIEnabled = useIsNewStorageUIEnabled() const [pathString, setPathString] = useState('') const [searchString, setSearchString] = useState('') @@ -286,12 +290,12 @@ export const FileExplorerHeader = ({ > {/* Navigation */}
        - {breadcrumbs.length > 0 && ( + {breadcrumbs.length > 1 && ( +
        +
      + ) : ( + + ) + ) : breadcrumbs.length > 1 ? ( - )} + ) : null}
    {/* Actions */} diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx index d3616e59a65..e827c71f24d 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx @@ -53,9 +53,6 @@ export const StorageExplorer = ({ bucket }: StorageExplorerProps) => { // Things like showing results from a search filter is "temporary", hence we use react state to manage const [itemSearchString, setItemSearchString] = useState('') - // Requires a fixed height to ensure that explorer is constrained to the viewport - const fileExplorerHeight = window.innerHeight - 122 - // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => { const fetchContents = async () => { @@ -178,7 +175,7 @@ export const StorageExplorer = ({ bucket }: StorageExplorerProps) => { ) : ( )} -
    +
    { const { ref, bucketId } = useParams() const { data: projectDetails } = useSelectedProjectQuery() const snap = useStorageExplorerStateSnapshot() + + const showMigrationCallout = useFlag('storageMigrationCallout') + const { data: config } = useProjectStorageConfigQuery( + { projectRef: ref }, + { enabled: showMigrationCallout } + ) + const isListV2UpgradeAvailable = + !!config && !config.capabilities.list_v2 && config.external.upstreamTarget === 'main' + const isBranch = projectDetails?.parent_project_ref !== undefined const [searchText, setSearchText] = useState('') @@ -159,7 +170,12 @@ export const StorageMenu = () => { {IS_PLATFORM && ( -

    Settings

    +
    +

    Settings

    + {isListV2UpgradeAvailable && ( + Upgrade available + )} +
    )} diff --git a/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx b/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx index e5b8e8592ef..b3ef2cc665a 100644 --- a/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx +++ b/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx @@ -1,29 +1,48 @@ -import { useParams } from 'common' import Link from 'next/link' + +import { IS_PLATFORM, useParams } from 'common' import { Menu } from 'ui' -import { BUCKET_TYPES, BUCKET_TYPE_KEYS, DEFAULT_BUCKET_TYPE } from './Storage.constants' +import { BUCKET_TYPES, BUCKET_TYPE_KEYS } from './Storage.constants' +import { useStorageV2Page } from './Storage.utils' export const StorageMenuV2 = () => { - const { ref, bucketType } = useParams() - const selectedBucketType = bucketType || DEFAULT_BUCKET_TYPE + const { ref } = useParams() + const page = useStorageV2Page() return ( - -
    - Bucket Types} /> + +
    +
    + Manage} /> - {BUCKET_TYPE_KEYS.map((bucketTypeKey) => { - const isSelected = selectedBucketType === bucketTypeKey - const config = BUCKET_TYPES[bucketTypeKey] + {BUCKET_TYPE_KEYS.map((bucketTypeKey) => { + const isSelected = page === bucketTypeKey + const config = BUCKET_TYPES[bucketTypeKey] - return ( - - -

    {config.displayName}

    -
    - - ) - })} + return ( + + +

    {config.displayName}

    +
    + + ) + })} +
    + + {IS_PLATFORM && ( + <> +
    +
    + Configuration} /> + + + +

    S3

    +
    + +
    + + )}
    ) diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx index 1c3d302beea..4be54f62c57 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx @@ -118,13 +118,22 @@ export const S3Connection = () => {
    - S3 Connection + Connection - Connect to your bucket using any S3-compatible service via the S3 protocol + Connect to your bucket using any S3-compatible service via the S3 protocol.
    + + {isErrorStorageConfig && ( + + )} +
    {projectIsLoading ? ( @@ -153,15 +162,6 @@ export const S3Connection = () => { )} /> - - {isErrorStorageConfig && ( -
    - -
    - )} @@ -227,7 +227,7 @@ export const S3Connection = () => {
    - S3 Access Keys + Access keys Manage your access keys for this project. diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx new file mode 100644 index 00000000000..4f02d92836b --- /dev/null +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx @@ -0,0 +1,143 @@ +import dayjs from 'dayjs' +import { toast } from 'sonner' + +import { useParams } from 'common' +import { InlineLink } from 'components/ui/InlineLink' +import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' +import { useState } from 'react' +import { + Button, + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogSection, + DialogSectionSeparator, + DialogTitle, + DialogTrigger, +} from 'ui' +import { Admonition, TimestampInfo } from 'ui-patterns' + +// [Joshen] Will be decided by Storage team, temp setting to 15th December 2025 UTC (3 months buffer) +const MIGRATION_DEADLINE = '2025-12-15T00:00:00' + +export const StorageListV2MigrationCallout = () => { + const deadline = dayjs(MIGRATION_DEADLINE).utc(true) + const currentDate = dayjs.utc() + const remainingMonths = Math.ceil(deadline.diff(currentDate, 'months', true)) + + return ( + +

    + Get access to the List-V2 endpoint for improved performance and the ability to enable + Analytics buckets to your storage system +

    + {remainingMonths <= 1 && ( +

    + Your project's Storage will be automatically upgraded by{' '} + {' '} + if the upgrade is not completed by then. +

    + )} +
    + +
    +
    + ) +} + +export const StorageListV2MigratingCallout = () => { + return ( + +

    + This notice will be closed once the upgrade has been completed - hang tight! +

    +
    + ) +} + +const StorageListV2MigrationDialog = () => { + const { ref } = useParams() + + const [open, setOpen] = useState(false) + + const { mutate: updateStorageConfig, isLoading: isUpdating } = + useProjectStorageConfigUpdateUpdateMutation({ + onSuccess: () => { + toast.success(`Project's storage will be upgraded shortly!`) + setOpen(false) + }, + }) + + const onConfirmUpgrade = () => { + if (!ref) return console.error('Project ref is required') + updateStorageConfig({ projectRef: ref, external: { upstreamTarget: 'canary' } }) + } + + return ( + + + + + + + Upgrade your project's Storage + + Get access to Analytics buckets and an improved list method + + + + + + + + +

    + Depending on the number of objects in your Storage, the migration can take up to 24 + hours to finish. +

    + +

    + The upgrade will increase your disk size to about 15 - 25% and IOPS will be used to + create new efficient indexes as well as denormalising tables. +

    + +

    + Ensure that your database instance has not{' '} + + scaled disk + {' '} + within the last 6h and you have at least 60%{' '} + + CPU capacity + {' '} + before proceeding. +

    +
    + + + + + +
    +
    + ) +} diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx index 9e0f0836b57..431f40e6522 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx @@ -6,7 +6,7 @@ import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import * as z from 'zod' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { ScaffoldSection } from 'components/layouts/Scaffold' import AlertError from 'components/ui/AlertError' import { InlineLink } from 'components/ui/InlineLink' @@ -41,6 +41,10 @@ import { TooltipTrigger, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { + StorageListV2MigratingCallout, + StorageListV2MigrationCallout, +} from './StorageListV2MigrationCallout' import { STORAGE_FILE_SIZE_LIMIT_MAX_BYTES_CAPPED, STORAGE_FILE_SIZE_LIMIT_MAX_BYTES_FREE_PLAN, @@ -59,6 +63,8 @@ interface StorageSettingsState { export const StorageSettings = () => { const { ref: projectRef } = useParams() + const showMigrationCallout = useFlag('storageMigrationCallout') + const { can: canReadStorageSettings, isLoading: isLoadingPermissions } = useAsyncCheckPermissions( PermissionAction.STORAGE_ADMIN_READ, '*' @@ -75,6 +81,10 @@ export const StorageSettings = () => { isSuccess, isError, } = useProjectStorageConfigQuery({ projectRef }) + const isListV2UpgradeAvailable = + !!config && !config.capabilities.list_v2 && config.external.upstreamTarget === 'main' + const isListV2Upgrading = + !!config && !config.capabilities.list_v2 && config.external.upstreamTarget === 'canary' const { data: organization } = useSelectedOrganizationQuery() const isFreeTier = organization?.plan.id === 'free' @@ -223,6 +233,12 @@ export const StorageSettings = () => { subject="Failed to retrieve project's storage configuration" /> )} + {isSuccess && showMigrationCallout && ( + <> + {isListV2UpgradeAvailable && } + {isListV2Upgrading && } + + )} {isSuccess && ( @@ -448,5 +464,3 @@ export const StorageSettings = () => { ) } - -export default StorageSettings diff --git a/apps/studio/components/interfaces/Storage/VectorsBuckets.tsx b/apps/studio/components/interfaces/Storage/VectorsBuckets.tsx new file mode 100644 index 00000000000..87e2dbbab12 --- /dev/null +++ b/apps/studio/components/interfaces/Storage/VectorsBuckets.tsx @@ -0,0 +1,6 @@ +import { EmptyBucketState } from './EmptyBucketState' + +export const VectorsBuckets = () => { + // Placeholder component - will be implemented in a later PR + return +} diff --git a/apps/studio/components/interfaces/Support/SupportFormV2.tsx b/apps/studio/components/interfaces/Support/SupportFormV2.tsx index 883f88881db..3d3871bf3d1 100644 --- a/apps/studio/components/interfaces/Support/SupportFormV2.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormV2.tsx @@ -467,6 +467,7 @@ export const SupportFormV2 = ({ ('triggersInsteadOfRealtime') const { realtimeAll: realtimeEnabled } = useIsFeatureEnabled(['realtime:all']) const { isSchemaLocked } = useIsProtectedSchema({ schema: table.schema }) @@ -116,6 +118,21 @@ export const GridHeaderActions = ({ table, isRefetching }: GridHeaderActionsProp }, }) + const { data: triggersData } = useDatabaseTriggersQuery( + { + projectRef: project?.ref, + connectionString: project?.connectionString, + }, + { + enabled: isTable, + } + ) + const tableTriggers = (triggersData ?? []).filter( + (trigger) => trigger.schema === table.schema && trigger.table === table.name + ) + + const tableTriggersCount = tableTriggers.length + const { can: canSqlWriteTables, isLoading: isLoadingPermissions } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables' @@ -147,6 +164,8 @@ export const GridHeaderActions = ({ table, isRefetching }: GridHeaderActionsProp const { mutate: sendEvent } = useSendEventMutation() + const manageTriggersHref = `/project/${ref}/database/triggers?schema=${table.schema}` + const toggleRealtime = async () => { if (!project) return console.error('Project is required') if (!realtimePublication) return console.error('Unable to find realtime publication') @@ -325,6 +344,55 @@ export const GridHeaderActions = ({ table, isRefetching }: GridHeaderActionsProp ) ) : null} + {isTable && triggersInsteadOfRealtime ? ( +
    + } + > + + {tableTriggersCount === 1 ? 'Trigger' : 'Triggers'} + + + ) : ( + realtimeEnabled && ( + + } + onClick={() => setShowEnableRealtime(true)} + className={cn(isRealtimeEnabled && 'w-7 h-7 p-0 text-brand hover:text-brand-hover')} + tooltip={{ + content: { + side: 'bottom', + text: isRealtimeEnabled + ? 'Click to disable realtime for this table' + : 'Click to enable realtime for this table', + }, + }} + > + {!isRealtimeEnabled && 'Enable Realtime'} + + ) + )} + {isView && viewHasLints && ( @@ -459,31 +527,6 @@ export const GridHeaderActions = ({ table, isRefetching }: GridHeaderActionsProp - {isTable && realtimeEnabled && ( - - } - onClick={() => setShowEnableRealtime(true)} - className={cn(isRealtimeEnabled && 'w-7 h-7 p-0 text-brand hover:text-brand-hover')} - tooltip={{ - content: { - side: 'bottom', - text: isRealtimeEnabled - ? 'Click to disable realtime for this table' - : 'Click to enable realtime for this table', - }, - }} - > - {!isRealtimeEnabled && 'Enable Realtime'} - - )} - {doesHaveAutoGeneratedAPIDocs && } diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx index 9e8252da627..9d6819c1224 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx @@ -113,7 +113,7 @@ const ColumnForeignKey = ({
    - {table !== undefined && ( + {table != undefined && ( , - color: 'hsl(var(--foreground-muted))', - }, - warning: { - label: , - color: 'hsl(var(--warning-default))', - }, - error: { - label: , - color: 'hsl(var(--destructive-default))', - }, -} satisfies ChartConfig export const REGIONS = ['ams', 'fra', 'gru', 'hkg', 'iad', 'syd'] as const export const METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] as const diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.tsx b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.tsx index 20050a0693e..d2250d0576a 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.tsx @@ -44,13 +44,29 @@ import { RefreshButton } from '../../ui/DataTable/RefreshButton' import { generateDynamicColumns, UNIFIED_LOGS_COLUMNS } from './components/Columns' import { DownloadLogsButton } from './components/DownloadLogsButton' import { LogsListPanel } from './components/LogsListPanel' +import { TooltipLabel } from './components/TooltipLabel' import { ServiceFlowPanel } from './ServiceFlowPanel' -import { CHART_CONFIG, SEARCH_PARAMS_PARSER } from './UnifiedLogs.constants' +import { SEARCH_PARAMS_PARSER } from './UnifiedLogs.constants' import { filterFields as defaultFilterFields } from './UnifiedLogs.fields' import { useLiveMode, useResetFocus } from './UnifiedLogs.hooks' import { QuerySearchParamsType } from './UnifiedLogs.types' import { getFacetedUniqueValues, getLevelRowClassName } from './UnifiedLogs.utils' +export const CHART_CONFIG = { + success: { + label: , + color: 'hsl(var(--foreground-muted))', + }, + warning: { + label: , + color: 'hsl(var(--warning-default))', + }, + error: { + label: , + color: 'hsl(var(--destructive-default))', + }, +} satisfies ChartConfig + export const UnifiedLogs = () => { useResetFocus() diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx index a57815f65d4..8fa1483de02 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx @@ -8,11 +8,14 @@ import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { withAuth } from 'hooks/misc/withAuth' import ProjectLayout from '../ProjectLayout/ProjectLayout' import { generateAuthMenu } from './AuthLayout.utils' +import { useFlag } from 'common' const AuthProductMenu = () => { const router = useRouter() const { ref: projectRef = 'default' } = useParams() + const authenticationShowOverview = useFlag('authOverviewPage') + const { authenticationSignInProviders, authenticationRateLimits, @@ -42,6 +45,7 @@ const AuthProductMenu = () => { authenticationMultiFactor, authenticationAttackProtection, authenticationAdvanced, + authenticationShowOverview, })} /> ) diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts index e40c51f9af4..67bad8717a3 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts @@ -10,6 +10,7 @@ export const generateAuthMenu = ( authenticationMultiFactor: boolean authenticationAttackProtection: boolean authenticationAdvanced: boolean + authenticationShowOverview: boolean } ): ProductMenuGroup[] => { const { @@ -19,12 +20,18 @@ export const generateAuthMenu = ( authenticationMultiFactor, authenticationAttackProtection, authenticationAdvanced, + authenticationShowOverview, } = flags ?? {} return [ { title: 'Manage', - items: [{ name: 'Users', key: 'users', url: `/project/${ref}/auth/users`, items: [] }], + items: [ + ...(authenticationShowOverview + ? [{ name: 'Overview', key: 'overview', url: `/project/${ref}/auth/overview`, items: [] }] + : []), + { name: 'Users', key: 'users', url: `/project/${ref}/auth/users`, items: [] }, + ], }, { title: 'Configuration', diff --git a/apps/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx b/apps/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx index 2f0b698771c..c3f6fc7885f 100644 --- a/apps/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx +++ b/apps/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx @@ -50,6 +50,7 @@ export const generateProductRoutes = ( edgeFunctions?: boolean storage?: boolean realtime?: boolean + authOverviewPage?: boolean isStorageV2?: boolean } ): Route[] => { @@ -61,6 +62,7 @@ export const generateProductRoutes = ( const edgeFunctionsEnabled = features?.edgeFunctions ?? true const storageEnabled = features?.storage ?? true const realtimeEnabled = features?.realtime ?? true + const authOverviewPageEnabled = features?.authOverviewPage ?? false const isStorageV2 = features?.isStorageV2 ?? false const databaseMenu = generateDatabaseMenu(project) @@ -86,7 +88,13 @@ export const generateProductRoutes = ( key: 'auth', label: 'Authentication', icon: , - link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/auth/users`), + link: + ref && + (isProjectBuilding + ? buildingUrl + : authOverviewPageEnabled + ? `/project/${ref}/auth/overview` + : `/project/${ref}/auth/users`), items: authMenu, }, ] diff --git a/apps/studio/components/layouts/StorageLayout/BucketLayout.tsx b/apps/studio/components/layouts/StorageLayout/BucketLayout.tsx deleted file mode 100644 index 53d2a252e6f..00000000000 --- a/apps/studio/components/layouts/StorageLayout/BucketLayout.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { PropsWithChildren } from 'react' - -import { useParams } from 'common' -import { BUCKET_TYPES, DEFAULT_BUCKET_TYPE } from 'components/interfaces/Storage/Storage.constants' -import { DocsButton } from 'components/ui/DocsButton' -import DefaultLayout from '../DefaultLayout' -import { PageLayout } from '../PageLayout/PageLayout' -import { ScaffoldContainer } from '../Scaffold' -import StorageLayout from './StorageLayout' - -export const BucketTypeLayout = ({ children }: PropsWithChildren) => { - const { bucketType } = useParams() - const bucketTypeKey = bucketType || DEFAULT_BUCKET_TYPE - const config = BUCKET_TYPES[bucketTypeKey as keyof typeof BUCKET_TYPES] - const secondaryActions = [] - - return ( - - - - {children} - - - - ) -} diff --git a/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx b/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx new file mode 100644 index 00000000000..1c9c46bcef5 --- /dev/null +++ b/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx @@ -0,0 +1,58 @@ +import { useRouter } from 'next/router' +import { PropsWithChildren, useEffect } from 'react' + +import { useParams } from 'common' +import { useIsNewStorageUIEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { BUCKET_TYPES } from 'components/interfaces/Storage/Storage.constants' +import { useStorageV2Page } from 'components/interfaces/Storage/Storage.utils' +import { DocsButton } from 'components/ui/DocsButton' +import { PageLayout } from '../PageLayout/PageLayout' +import { ScaffoldContainer } from '../Scaffold' + +export const StorageBucketsLayout = ({ + title, + hideSubtitle = false, + children, +}: PropsWithChildren<{ title?: string; hideSubtitle?: boolean }>) => { + const { ref } = useParams() + const router = useRouter() + const page = useStorageV2Page() + const isStorageV2 = useIsNewStorageUIEnabled() + + const config = !!page && page !== 's3' ? BUCKET_TYPES[page] : undefined + + const navigationItems = + page === 'files' + ? [ + { + label: 'Buckets', + href: `/project/${ref}/storage/files`, + }, + { + label: 'Settings', + href: `/project/${ref}/storage/files/settings`, + }, + { + label: 'Policies', + href: `/project/${ref}/storage/files/policies`, + }, + ] + : [] + + useEffect(() => { + if (!isStorageV2) router.replace(`/project/${ref}/storage/buckets`) + }, [isStorageV2, ref, router]) + + return ( + ] : []} + > + {children} + + ) +} diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx index 757ee95ff9c..a723b64bf16 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx @@ -10,6 +10,7 @@ import { LOCAL_STORAGE_KEYS, useFlag } from 'common' import { useParams, useSearchParamsShallow } from 'common/hooks' import { Markdown } from 'components/interfaces/Markdown' import { useCheckOpenAIKeyQuery } from 'data/ai/check-api-key-query' +import { useRateMessageMutation } from 'data/ai/rate-message-mutation' import { constructHeaders } from 'data/fetchers' import { useTablesQuery } from 'data/tables/tables-query' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' @@ -83,10 +84,13 @@ export const AIAssistant = ({ className }: AIAssistantProps) => { const [value, setValue] = useState(snap.initialInput || '') const [editingMessageId, setEditingMessageId] = useState(null) const [isResubmitting, setIsResubmitting] = useState(false) + const [messageRatings, setMessageRatings] = useState>({}) const { data: check, isSuccess } = useCheckOpenAIKeyQuery() const isApiKeySet = IS_PLATFORM || !!check?.hasKey + const { mutateAsync: rateMessage } = useRateMessageMutation() + const isInSQLEditor = router.pathname.includes('/sql/[id]') const snippet = snippets[entityId ?? ''] const snippetContent = snippet?.snippet?.content?.sql @@ -260,6 +264,47 @@ export const AIAssistant = ({ className }: AIAssistantProps) => { setValue('') }, [setValue]) + const handleRateMessage = useCallback( + async (messageId: string, rating: 'positive' | 'negative', reason?: string) => { + if (!project?.ref || !selectedOrganization?.slug) return + + // Optimistically update UI + setMessageRatings((prev) => ({ ...prev, [messageId]: rating })) + + try { + const result = await rateMessage({ + rating, + messages: chatMessages, + messageId, + projectRef: project.ref, + orgSlug: selectedOrganization.slug, + reason, + }) + + sendEvent({ + action: 'assistant_message_rating_submitted', + properties: { + rating, + category: result.category, + ...(reason && { reason }), + }, + groups: { + project: project.ref, + organization: selectedOrganization.slug, + }, + }) + } catch (error) { + console.error('Failed to rate message:', error) + // Rollback on error + setMessageRatings((prev) => { + const { [messageId]: _, ...rest } = prev + return rest + }) + } + }, + [chatMessages, project?.ref, selectedOrganization?.slug, rateMessage, sendEvent] + ) + const renderedMessages = useMemo( () => chatMessages.map((message, index) => { @@ -283,6 +328,8 @@ export const AIAssistant = ({ className }: AIAssistantProps) => { isBeingEdited={isBeingEdited} onCancelEdit={cancelEdit} isLastMessage={isLastMessage} + onRate={handleRateMessage} + rating={messageRatings[message.id] ?? null} /> ) }), @@ -294,6 +341,8 @@ export const AIAssistant = ({ className }: AIAssistantProps) => { editingMessageId, chatStatus, addToolResult, + handleRateMessage, + messageRatings, ] ) diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx index 140f8c08804..2170e2afee8 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx @@ -1,13 +1,33 @@ -import { Pencil, Trash2 } from 'lucide-react' -import { type PropsWithChildren } from 'react' +import { Pencil, ThumbsDown, ThumbsUp, Trash2 } from 'lucide-react' +import { type PropsWithChildren, useState, useEffect } from 'react' +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' +import * as z from 'zod' import { ButtonTooltip } from '../ButtonTooltip' +import { + cn, + Button, + Popover_Shadcn_, + PopoverTrigger_Shadcn_, + PopoverContent_Shadcn_, + Form_Shadcn_, + FormField_Shadcn_, + FormControl_Shadcn_, + TextArea_Shadcn_, +} from 'ui' +import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -export function MessageActions({ children }: PropsWithChildren<{}>) { +export function MessageActions({ + children, + alwaysShow = false, +}: PropsWithChildren<{ alwaysShow?: boolean }>) { return (
    -
    {children}
    +
    + {children} +
    ) } @@ -44,3 +64,147 @@ function MessageActionsDelete({ onClick }: { onClick: () => void }) { ) } MessageActions.Delete = MessageActionsDelete + +function MessageActionsThumbsUp({ + onClick, + isActive, + disabled, +}: { + onClick: () => void + isActive?: boolean + disabled?: boolean +}) { + return ( + + + + {form.formState.isSubmitSuccessful ? ( +

    We appreciate your feedback!

    + ) : ( + + + ( + + + + + + )} + /> +
    + +
    + +
    + )} +
    + + ) +} +MessageActions.ThumbsDown = MessageActionsThumbsDown diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx index 70a2ff87c8e..e9905ce824f 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx @@ -18,6 +18,7 @@ export interface MessageInfo { isLastMessage?: boolean state: 'idle' | 'editing' | 'predecessor-editing' + rating?: 'positive' | 'negative' | null } export interface MessageActions { @@ -26,6 +27,7 @@ export interface MessageActions { onDelete: (id: string) => void onEdit: (id: string) => void onCancelEdit: () => void + onRate?: (id: string, rating: 'positive' | 'negative', reason?: string) => void } const MessageInfoContext = createContext(null) diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx index 5f4a95e88d3..e457ca2ae32 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx @@ -5,7 +5,8 @@ import { ProfileImage as ProfileImageDisplay } from 'components/ui/ProfileImage' import { useProfileNameAndPicture } from 'lib/profile' import { cn } from 'ui' import { useMessageInfoContext } from './Message.Context' -import { MessageMarkdown, MessagePartSwitcher } from './Message.Parts' +import { MessageMarkdown } from './MessageMarkdown' +import { MessagePartSwitcher } from './Message.Parts' function MessageDisplayProfileImage() { const { username, avatarUrl } = useProfileNameAndPicture() @@ -75,7 +76,7 @@ function MessageDisplayTextMessage({ id={id} isLoading={isLoading} readOnly={readOnly} - className="prose prose-sm max-w-none break-words" + className="prose prose-sm max-w-none break-words prose-h2:font-medium" > {children} diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx index 994d15b2243..a3b54c37c9d 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx @@ -1,12 +1,8 @@ import { UIMessage as VercelMessage } from '@ai-sdk/react' import { type DynamicToolUIPart, type ReasoningUIPart, type TextUIPart, type ToolUIPart } from 'ai' import { BrainIcon, CheckIcon, Loader2 } from 'lucide-react' -import { useMemo, type PropsWithChildren } from 'react' -import ReactMarkdown from 'react-markdown' -import { type Components } from 'react-markdown/lib/ast-to-react' -import remarkGfm from 'remark-gfm' -import { cn, markdownComponents } from 'ui' +import { cn } from 'ui' import { DisplayBlockRenderer } from './DisplayBlockRenderer' import { EdgeFunctionRenderer } from './EdgeFunctionRenderer' import { Tool } from './elements/Tool' @@ -16,71 +12,7 @@ import { deployEdgeFunctionOutputSchema, parseExecuteSqlChartResult, } from './Message.utils' -import { - Heading3, - Hyperlink, - InlineCode, - ListItem, - MarkdownPre, - OrderedList, -} from './MessageMarkdown' - -const baseMarkdownComponents: Partial = { - ol: OrderedList, - li: ListItem, - h3: Heading3, - code: InlineCode, - a: Hyperlink, - img: ({ src }) => [Image: {src}], -} - -export function MessageMarkdown({ - id, - isLoading, - readOnly, - className, - children, -}: PropsWithChildren<{ - id: string - isLoading: boolean - readOnly?: boolean - className?: string -}>) { - const markdownSource = useMemo(() => { - if (typeof children === 'string') { - return children - } - - if (Array.isArray(children)) { - return children.filter((child): child is string => typeof child === 'string').join('') - } - - return '' - }, [children]) - - const allMarkdownComponents: Partial = useMemo( - () => ({ - ...markdownComponents, - ...baseMarkdownComponents, - pre: ({ children }) => ( - - {children} - - ), - }), - [id, isLoading, readOnly] - ) - - return ( - - {markdownSource} - - ) -} +import { MessageMarkdown } from './MessageMarkdown' function MessagePartText({ textPart }: { textPart: TextUIPart }) { const { id, isLoading, readOnly, isUserMessage, state } = useMessageInfoContext() @@ -91,7 +23,7 @@ function MessagePartText({ textPart }: { textPart: TextUIPart }) { isLoading={isLoading} readOnly={readOnly} className={cn( - 'max-w-none space-y-4 prose prose-sm prose-li:mt-1 [&>div]:my-4 prose-h1:text-xl prose-h1:mt-6 prose-h2:text-lg prose-h3:no-underline prose-h3:text-base prose-h3:mb-4 prose-strong:font-medium prose-strong:text-foreground prose-ol:space-y-3 prose-ul:space-y-3 prose-li:my-0 break-words [&>p:not(:last-child)]:!mb-2 [&>*>p:first-child]:!mt-0 [&>*>p:last-child]:!mb-0 [&>*>*>p:first-child]:!mt-0 [&>*>*>p:last-child]:!mb-0 [&>ol>li]:!pl-4', + 'max-w-none space-y-4 prose prose-sm prose-li:mt-1 [&>div]:my-4 prose-h1:text-xl prose-h1:mt-6 prose-h2:text-lg prose-h2:font-medium prose-h3:no-underline prose-h3:text-base prose-h3:mb-4 prose-strong:font-medium prose-strong:text-foreground prose-ol:space-y-3 prose-ul:space-y-3 prose-li:my-0 break-words [&>p:not(:last-child)]:!mb-2 [&>*>p:first-child]:!mt-0 [&>*>p:last-child]:!mb-0 [&>*>*>p:first-child]:!mt-0 [&>*>*>p:last-child]:!mb-0 [&>ol>li]:!pl-4', isUserMessage && 'text-foreground [&>p]:font-medium', state === 'editing' && 'animate-pulse' )} diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.tsx index 61c3f6f2fc7..77966838525 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.tsx @@ -10,8 +10,12 @@ import { MessageDisplay } from './Message.Display' import { MessageProvider, useMessageActionsContext, useMessageInfoContext } from './Message.Context' function AssistantMessage({ message }: { message: VercelMessage }) { - const { variant, state } = useMessageInfoContext() - const { onCancelEdit } = useMessageActionsContext() + const { id, variant, state, isLastMessage, readOnly, rating, isLoading } = useMessageInfoContext() + const { onCancelEdit, onRate } = useMessageActionsContext() + + const handleRate = (newRating: 'positive' | 'negative', reason?: string) => { + onRate?.(id, newRating, reason) + } return ( + {!readOnly && isLastMessage && onRate && !isLoading && ( + + handleRate('positive')} + isActive={rating === 'positive'} + disabled={!!rating} + /> + handleRate('negative', reason)} + isActive={rating === 'negative'} + disabled={!!rating} + /> + + )} ) } @@ -81,6 +99,8 @@ interface MessageProps { isBeingEdited: boolean onCancelEdit: () => void isLastMessage?: boolean + onRate?: (id: string, rating: 'positive' | 'negative', reason?: string) => void + rating?: 'positive' | 'negative' | null } export function Message(props: MessageProps) { @@ -99,6 +119,7 @@ export function Message(props: MessageProps) { ? 'predecessor-editing' : 'idle', isLastMessage: props.isLastMessage, + rating: props.rating, } satisfies MessageInfo const messageActions = { @@ -106,6 +127,7 @@ export function Message(props: MessageProps) { onDelete: props.onDelete, onEdit: props.onEdit, onCancelEdit: props.onCancelEdit, + onRate: props.onRate, } return ( diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.utils.ts b/apps/studio/components/ui/AIAssistantPanel/Message.utils.ts index cf80eb9572c..16f6125896e 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.utils.ts +++ b/apps/studio/components/ui/AIAssistantPanel/Message.utils.ts @@ -96,3 +96,18 @@ export const deployEdgeFunctionInputSchema = z export const deployEdgeFunctionOutputSchema = z .object({ success: z.boolean().optional() }) .passthrough() + +export const rateMessageResponseSchema = z.object({ + category: z.enum([ + 'sql_generation', + 'schema_design', + 'rls_policies', + 'edge_functions', + 'database_optimization', + 'debugging', + 'general_help', + 'other', + ]), +}) + +export type RateMessageResponse = z.infer diff --git a/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx b/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx index c929a274415..1e26e1befc2 100644 --- a/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx @@ -1,6 +1,15 @@ -import { Loader2 } from 'lucide-react' +import dynamic from 'next/dynamic' import Link from 'next/link' -import { memo, ReactNode, useEffect, useMemo, useRef } from 'react' +import { + isValidElement, + memo, + ReactNode, + useEffect, + useMemo, + useRef, + type ReactElement, +} from 'react' +import type { StreamdownProps } from 'streamdown' import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' import { @@ -8,6 +17,7 @@ import { cn, CodeBlock, CodeBlockLang, + markdownComponents, Dialog, DialogClose, DialogContent, @@ -23,29 +33,34 @@ import { CollapsibleCodeBlock } from './CollapsibleCodeBlock' import { DisplayBlockRenderer } from './DisplayBlockRenderer' import { defaultUrlTransform } from './Message.utils' -export const OrderedList = memo(({ children }: { children: ReactNode }) => ( +const Streamdown = dynamic( + () => import('streamdown').then((mod) => mod.Streamdown), + { ssr: false } +) + +export const OrderedList = memo(({ children }: { children?: ReactNode }) => (
      {children}
    )) OrderedList.displayName = 'OrderedList' -export const ListItem = memo(({ children }: { children: ReactNode }) => ( +export const ListItem = memo(({ children }: { children?: ReactNode }) => (
  • {children}
  • )) ListItem.displayName = 'ListItem' -export const Heading3 = memo(({ children }: { children: ReactNode }) => ( +export const Heading3 = memo(({ children }: { children?: ReactNode }) => (

    {children}

    )) Heading3.displayName = 'Heading3' export const InlineCode = memo( - ({ className, children }: { className?: string; children: ReactNode }) => ( + ({ className, children }: { className?: string; children?: ReactNode }) => ( {children} ) ) InlineCode.displayName = 'InlineCode' -export const Hyperlink = memo(({ href, children }: { href?: string; children: ReactNode }) => { +export const Hyperlink = memo(({ href, children }: { href?: string; children?: ReactNode }) => { const isExternalURL = !href?.startsWith('https://supabase.com/dashboard') const safeUrl = defaultUrlTransform(href ?? '') const isSafeUrl = safeUrl.length > 0 @@ -103,6 +118,62 @@ export const Hyperlink = memo(({ href, children }: { href?: string; children: Re }) Hyperlink.displayName = 'Hyperlink' +const baseMarkdownComponents = { + ol: OrderedList, + li: ListItem, + h3: Heading3, + code: InlineCode, + a: Hyperlink, + img: ({ src }: JSX.IntrinsicElements['img']) => ( + [Image: {src}] + ), +} + +export function MessageMarkdown({ + id, + isLoading, + readOnly, + className, + children, +}: { + id: string + isLoading: boolean + readOnly?: boolean + className?: string + children: ReactNode +}) { + const markdownSource = useMemo(() => { + if (typeof children === 'string') { + return children + } + + if (Array.isArray(children)) { + return children.filter((child): child is string => typeof child === 'string').join('') + } + + return '' + }, [children]) + + const allMarkdownComponents = useMemo( + () => ({ + ...markdownComponents, + ...baseMarkdownComponents, + pre: (props: JSX.IntrinsicElements['pre']) => ( + + {props.children} + + ), + }), + [id, isLoading, readOnly] + ) + + return ( + + {markdownSource} + + ) +} + export const MarkdownPre = ({ children, id, @@ -123,8 +194,16 @@ export const MarkdownPre = ({ cumulative: false, }) - const language = children[0].props.className?.replace('language-', '') || 'sql' - const rawContent = children[0].props.children[0] + const childArray = Array.isArray(children) ? children : [children] + const codeElement = childArray.find((child): child is ReactElement => isValidElement(child)) + const codeProps = codeElement?.props || {} + const language = codeProps.className?.replace('language-', '') || 'sql' + const codeChildren = codeProps.children + const rawContent = Array.isArray(codeChildren) + ? codeChildren.map((node) => (typeof node === 'string' ? node : '')).join('') + : typeof codeChildren === 'string' + ? codeChildren + : '' const propsMatch = rawContent.match(/(?:--|\/\/)\s*props:\s*(\{[^}]+\})/) const snippetProps: AssistantSnippetProps = useMemo(() => { @@ -155,6 +234,10 @@ export const MarkdownPre = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [snippetProps]) + if (!codeElement) { + return
    {children}
    + } + return (
    {language === 'edge' ? ( @@ -167,11 +250,6 @@ export const MarkdownPre = ({ ) : language === 'sql' ? ( readOnly ? ( - ) : isLoading ? ( -
    - - Writing SQL... -
    ) : ( { title?: string @@ -26,8 +31,20 @@ interface FilterPopoverProps { clearButtonText?: string className?: string onSaveFilters: (options: string[]) => void + + // [Joshen] These props are to support async data with infinite loading if applicable + search?: string + setSearch?: (value: string) => void + hasNextPage?: boolean + isLoading?: boolean + isFetching?: boolean + isFetchingNextPage?: boolean + fetchNextPage?: () => void } +// [Joshen] Known issue currently that FilterPopover trigger label will not show selected options properly +// for async data with infinite loading. Thinking this requires quite a bit of change that I'd rather do in +// a separate PR export const FilterPopover = >({ title, options = [], @@ -44,10 +61,25 @@ export const FilterPopover = >({ maxHeightClass = 'h-[205px]', clearButtonText = 'Clear', onSaveFilters, + + search, + setSearch = noop, + hasNextPage = false, + isLoading = false, + isFetching = false, + isFetchingNextPage = false, + fetchNextPage = noop, }: FilterPopoverProps) => { const [open, setOpen] = useState(false) const [selectedOptions, setSelectedOptions] = useState([]) + const scrollRootRef = useRef(null) + const [sentinelRef, entry] = useIntersectionObserver({ + root: scrollRootRef.current, + threshold: 0, + rootMargin: '0px', + }) + const formattedOptions = activeOptions.map((option) => { const base = options.find((x) => x[valueKey] === option) if (!base || !base[labelKey]) { @@ -58,8 +90,31 @@ export const FilterPopover = >({ useEffect(() => { if (!open && activeOptions.length > 0) setSelectedOptions(activeOptions) + if (!open) setSearch('') }, [open, activeOptions]) + useEffect(() => { + if ( + open && + entry?.isIntersecting && + hasNextPage && + !isLoading && + !isFetching && + !isFetchingNextPage + ) { + console.log('Fetch next page') + fetchNextPage() + } + }, [ + open, + entry?.isIntersecting, + fetchNextPage, + hasNextPage, + isFetching, + isFetchingNextPage, + isLoading, + ]) + return ( @@ -83,20 +138,46 @@ export const FilterPopover = >({
    - +
    {title ?? `Select ${name.toLowerCase()}`}
    + {search !== undefined && ( + { + if (!!setSearch) setSearch(e.target.value) + }} + className="rounded-none border-x-0 border-t-0 bg-surface-100 px-3" + placeholder="Search for a project..." + actions={ + (search ?? '').length > 0 ? ( + setSearch('')} /> + ) : null + } + /> + )} + {(search ?? '').length > 0 && options.length === 0 && ( +

    No results found

    + )} 7 ? maxHeightClass : ''}> -
    +
    {options.map((option) => { const value = option[valueKey] const icon = iconKey ? option[iconKey] : undefined return ( -
    +
    >({ ) })}
    +
    + {hasNextPage && ( +
    + +
    + )}
    + } + breadcrumbs={[ + { + label: 'Files', + href: `/project/${ref}/storage/files`, + }, + ]} + primaryActions={ + <> + + + + } + > +
    + +
    + + + setShowEditModal(false)} + /> + + ) +} + +BucketPage.getLayout = (page) => ( + + {page} + +) + +export default BucketPage diff --git a/apps/studio/pages/project/[ref]/storage/files/index.tsx b/apps/studio/pages/project/[ref]/storage/files/index.tsx new file mode 100644 index 00000000000..3d92fda273c --- /dev/null +++ b/apps/studio/pages/project/[ref]/storage/files/index.tsx @@ -0,0 +1,19 @@ +import { FilesBuckets } from 'components/interfaces/Storage/FilesBuckets' +import DefaultLayout from 'components/layouts/DefaultLayout' +import { StorageBucketsLayout } from 'components/layouts/StorageLayout/StorageBucketsLayout' +import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' +import type { NextPageWithLayout } from 'types' + +const StorageFilesPage: NextPageWithLayout = () => { + return +} + +StorageFilesPage.getLayout = (page) => ( + + + {page} + + +) + +export default StorageFilesPage diff --git a/apps/studio/pages/project/[ref]/storage/files/policies.tsx b/apps/studio/pages/project/[ref]/storage/files/policies.tsx new file mode 100644 index 00000000000..114bac7ebcd --- /dev/null +++ b/apps/studio/pages/project/[ref]/storage/files/policies.tsx @@ -0,0 +1,19 @@ +import { StoragePolicies } from 'components/interfaces/Storage/StoragePolicies/StoragePolicies' +import DefaultLayout from 'components/layouts/DefaultLayout' +import { StorageBucketsLayout } from 'components/layouts/StorageLayout/StorageBucketsLayout' +import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' +import type { NextPageWithLayout } from 'types' + +const FilesPoliciesPage: NextPageWithLayout = () => { + return +} + +FilesPoliciesPage.getLayout = (page) => ( + + + {page} + + +) + +export default FilesPoliciesPage diff --git a/apps/studio/pages/project/[ref]/storage/files/settings.tsx b/apps/studio/pages/project/[ref]/storage/files/settings.tsx new file mode 100644 index 00000000000..8ed346b33b2 --- /dev/null +++ b/apps/studio/pages/project/[ref]/storage/files/settings.tsx @@ -0,0 +1,19 @@ +import { StorageSettings } from 'components/interfaces/Storage/StorageSettings/StorageSettings' +import DefaultLayout from 'components/layouts/DefaultLayout' +import { StorageBucketsLayout } from 'components/layouts/StorageLayout/StorageBucketsLayout' +import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' +import type { NextPageWithLayout } from 'types' + +const FilesSettingsPage: NextPageWithLayout = () => { + return +} + +FilesSettingsPage.getLayout = (page) => ( + + + {page} + + +) + +export default FilesSettingsPage diff --git a/apps/studio/pages/project/[ref]/storage/s3.tsx b/apps/studio/pages/project/[ref]/storage/s3.tsx new file mode 100644 index 00000000000..88e30cd3ab0 --- /dev/null +++ b/apps/studio/pages/project/[ref]/storage/s3.tsx @@ -0,0 +1,21 @@ +import { S3Connection } from 'components/interfaces/Storage/StorageSettings/S3Connection' +import DefaultLayout from 'components/layouts/DefaultLayout' +import { StorageBucketsLayout } from 'components/layouts/StorageLayout/StorageBucketsLayout' +import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' +import type { NextPageWithLayout } from 'types' + +const S3SettingsPage: NextPageWithLayout = () => { + return +} + +S3SettingsPage.getLayout = (page) => ( + + + + {page} + + + +) + +export default S3SettingsPage diff --git a/apps/studio/pages/project/[ref]/storage/vectors/index.tsx b/apps/studio/pages/project/[ref]/storage/vectors/index.tsx new file mode 100644 index 00000000000..edc9ae1886b --- /dev/null +++ b/apps/studio/pages/project/[ref]/storage/vectors/index.tsx @@ -0,0 +1,19 @@ +import { VectorsBuckets } from 'components/interfaces/Storage/VectorsBuckets' +import DefaultLayout from 'components/layouts/DefaultLayout' +import { StorageBucketsLayout } from 'components/layouts/StorageLayout/StorageBucketsLayout' +import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' +import type { NextPageWithLayout } from 'types' + +const StorageVectorsPage: NextPageWithLayout = () => { + return +} + +StorageVectorsPage.getLayout = (page) => ( + + + {page} + + +) + +export default StorageVectorsPage diff --git a/apps/studio/public/img/auth-overview/auth-overview-assistant.jpg b/apps/studio/public/img/auth-overview/auth-overview-assistant.jpg new file mode 100644 index 00000000000..9a17a8c9fb6 Binary files /dev/null and b/apps/studio/public/img/auth-overview/auth-overview-assistant.jpg differ diff --git a/apps/studio/public/img/auth-overview/auth-overview-docs.jpg b/apps/studio/public/img/auth-overview/auth-overview-docs.jpg new file mode 100644 index 00000000000..788efba5a1f Binary files /dev/null and b/apps/studio/public/img/auth-overview/auth-overview-docs.jpg differ diff --git a/apps/studio/public/img/auth-overview/auth-overview-logs.jpg b/apps/studio/public/img/auth-overview/auth-overview-logs.jpg new file mode 100644 index 00000000000..3573468e452 Binary files /dev/null and b/apps/studio/public/img/auth-overview/auth-overview-logs.jpg differ diff --git a/apps/studio/static-data/integrations/firebase_wrapper/overview.md b/apps/studio/static-data/integrations/firebase_wrapper/overview.md index 9433175384d..aae9cdc77c2 100644 --- a/apps/studio/static-data/integrations/firebase_wrapper/overview.md +++ b/apps/studio/static-data/integrations/firebase_wrapper/overview.md @@ -1,3 +1,3 @@ Firebase is an app development platform built around non-relational technologies. The Firebase Wrapper supports connecting to below objects. -The Firebase Wrapper is aforeign data wrapper which allows you to read data from Firebase within your Postgres database. +The Firebase Wrapper is a foreign data wrapper which allows you to read data from Firebase within your Postgres database. diff --git a/apps/studio/styles/typography.scss b/apps/studio/styles/typography.scss index 55a5ca29ace..ab28b715c71 100644 --- a/apps/studio/styles/typography.scss +++ b/apps/studio/styles/typography.scss @@ -72,6 +72,6 @@ /* Link */ .text-link { - @apply text-foreground-light underline underline-offset-4 decoration-border hover:decoration-foreground transition-colors hover:text-foreground; + @apply text-foreground-light underline underline-offset-4 decoration-inherit hover:decoration-foreground transition-colors hover:text-foreground; } } diff --git a/apps/ui-library/components/mdx-components.tsx b/apps/ui-library/components/mdx-components.tsx index ff192643d0b..40bd29ad716 100644 --- a/apps/ui-library/components/mdx-components.tsx +++ b/apps/ui-library/components/mdx-components.tsx @@ -158,11 +158,21 @@ const components = { ), Callout, ComponentPreview, + CopyButton, TanStackBeta, + Card: ({ className, ...props }: React.HTMLAttributes) => ( +
    + ), LinkedCard: ({ className, ...props }: React.ComponentProps) => ( - + Next.js -

    Next.js

    -
    +

    Next.js

    +
    +

    + `$``npx create-next-app -e with-supabase` +

    + +
    + + +Leaping AI chose Supabase for scalability. + + + Supabase makes Postgres management and scaling very easy. Integration with auth also simplifies a + lot of things and get you running quickly. Supabase — supagood. + + +Cekura + +Cekura AI chose Supabase for security. + + + We were up and running with Supabase in no time. The combination of easy setup and + production-ready auth gave us the confidence to focus on our product instead of infrastructure. + For a startup, that speed makes all the difference. + + +Zaymo + +Zaymo chose Supabase for speed. + + + Supabase has been game-changing for us. It was the obvious choice to start out, and it has scaled + with us. Every time I start thinking it might be time to switch off, they launch a new feature or + I find an extension that is exactly what I need. It has literally saved me weeks of time. + + +Cheers + +Cheers chose Supabase right from the start. + + + We've been building on Supabase since day 1 and absolutely love it. We'd die before we switch off + Supabase. + + +## A platform for builders + +The most important part of finding product market fit is getting products in the hands of your customers as fast as possible and iterating on their feedback until you find something that works. Supabase is a fully functional back end out of the box, with all the power of Postgres under the hood. Developers and non-developers alike can start in minutes, using an integrated suite of tools, and scaling without retooling or vendor lock-in. + +- [Database](https://supabase.com/database), [Auth](https://supabase.com/auth), [Storage](https://supabase.com/storage), [Edge Functions](https://supabase.com/edge-functions), [Realtime](https://supabase.com/realtime), and [Vector](https://supabase.com/modules/vector) search. +- Seamless integration with popular frameworks. +- Predictable pricing that scales with usage. +- World-class support. + +Startups that choose Supabase can build and scale their product without the backend bottleneck. + +## Builders are everywhere + +Of course, you don’t need to be backed by Y Combinator to build a successful startup. Fast-growing companies like [Udio](https://supabase.com/customers/udio), [Euka](https://supabase.com/customers/euka), and [Pebblely](https://supabase.com/customers/pebblely) are also built on Supabase. Supabase is proud to partner with more than 80 other startup accelerators and early-stage investors across the global startup ecosystem, a program that we are rapidly expanding. Why? Because we believe in the power of builders to change the world - and we want to help you build faster! diff --git a/apps/www/_blog/2025-10-03-login-with-solana-ethereum.mdx b/apps/www/_blog/2025-10-03-login-with-solana-ethereum.mdx new file mode 100644 index 00000000000..a0617744510 --- /dev/null +++ b/apps/www/_blog/2025-10-03-login-with-solana-ethereum.mdx @@ -0,0 +1,110 @@ +--- +title: 'gm 👋 web3, welcome aboard to Sign in with Web3 (Solana, Ethereum)' +description: 'Ethereum and Solana wallet authentication now supported in Supabase Auth.' +author: stojan +image: select/2025/login-w-solana-ethereum/og.png +thumb: select/2025/login-w-solana-ethereum/thumb.png +launchweek: 'select-2025' +categories: + - launch-week +tags: + - select +date: '2025-10-03:10:00:00' +toc_depth: 2 +--- + +Today we're announcing [support for Web3 logins using Ethereum and Solana](https://supabase.com/docs/guides/auth/auth-web3). This has been one of the historically most requested features for Supabase. + +It's all based on the widely adopted [Sign in with Ethereum standard (EIP-4361)](https://eips.ethereum.org/EIPS/eip-4361), which both Ethereum and Solana off-chain wallet authentication is based on. This protocol is widely adopted across all of the popular wallet applications (both software and hardware) today, so building a Web3 application on top of Supabase has never been easier. + +## How does it work? + +We wanted to make it simple. The Sign in with Ethereum standard defines a particular message structure, one that looks like so: + +``` +example.com wants you to sign in with your Ethereum account: +0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + +I accept the ExampleOrg Terms of Service: + +URI: +Version: 1 +Chain ID: 1 +Nonce: 32891756 +Issued At: 2021-09-30T16:25:24Z +Resources: +- +``` + +It's interpreted both by the wallet application, which presents a secure login confirmation dialog, while also being validated by Supabase Auth before issuing a user session. + +Most of these details are already handled for you by the Supabase JavaScript SDK, so it's really as simple as calling this in your Web3 app: + +```tsx +await supabase.auth.signInWithWeb3({ + chain: 'ethereum', // or 'solana' + statement: 'I <3 Supabase!', +}) +``` + +The API is powerful enough to support more modern approaches to building Web3 applications such as using the [Solana Wallet Adapter](https://solana.com/developers/courses/intro-to-solana/interact-with-wallets#solanas-wallet-adapter) system or the [Ethereum Wallet Discovery Mechanism](https://docs.metamask.io/wallet/tutorials/react-dapp-local-state). + +You can configure these on the Supabase Dashboard, or in the Supabase CLI: + +```toml +[auth.web3.solana] +enabled = true + +[auth.web3.ethereum] +enabled = true + +``` + +Don't forget to configure rate-limits and CAPTCHA, as Web3 apps are usually more prone to abuse by bots: + +```toml +[auth.rate_limit] +# Number of Web3 logins that can be made in a 5 minute interval per IP address. +web3 = 30 + +[auth.captcha] +enabled = true +provider = "hcaptcha" # or other supported providers +secret = "0x0000000000000000000000000000000000000000" + +``` + +## How we built it? + +At Supabase we cherish our community and our contributors. For this feature, we asked our community for help by co-sponsoring a bounty with the Solana Foundation. We asked them to [help us find a contributor](https://x.com/nickfrosty/status/1880046815950836179) who knows the ecosystem well to help us launch: +![request for contributors](/images/blog/select/2025/login-w-solana-ethereum/twitter-nickfrosty.png) + +And we [found](https://x.com/Bewinxed/status/1880148679165976930) someone great! + +![Omar (Bewinxed) twitter answer](/images/blog/select/2025/login-w-solana-ethereum/twitter-bewinxed.png) + + + +Being in the Web3 space, specifically in Solana since 2021, I've used Supabase on a few projects. So as soon as I saw the tweet saying Supabase needed help implementing Sign in with Solana, I had to jump in! + +It was interesting seeing the difference when building for Supabase scale, as opposed to building small personal projects. We put in a lot of effort to provide the Web3 community with the great DX Supabase is known for, security and standards compliance. + + + +Once we made Sign in with Solana available in April, we decided to further our collaboration and continue working on the Sign in with Ethereum implementation. Omar has continued working with us on other exciting features coming soon! + +## Start using Sign in with Web3 today + +Real-world use cases for Web3 authentication are already here. Developers are using wallet-based sign-in to power: + +- NFT marketplaces where collectors can trade digital assets securely +- DAOs that rely on wallet verification for membership and voting +- Token-gated applications that unlock features based on wallet contents +- DeFi dashboards that let users manage assets without creating yet another password + +You can get started right now: + +- Check out the [docs for Sign in with Web3](https://supabase.com/docs/guides/auth/auth-web3) +- [Sign up for Supabase](https://www.supabase.com/dashboard) and try it in your project + +We can’t wait to see what you build. diff --git a/apps/www/_blog/2025-10-03-remote-mcp-server.mdx b/apps/www/_blog/2025-10-03-remote-mcp-server.mdx new file mode 100644 index 00000000000..737c7b0c175 --- /dev/null +++ b/apps/www/_blog/2025-10-03-remote-mcp-server.mdx @@ -0,0 +1,138 @@ +--- +title: 'Announcing the Supabase Remote MCP Server' +description: 'Remote MCP server enables AI agents to connect with Supabase projects.' +author: gregnr +image: select/2025/remote-mcp-server/og.png +thumb: select/2025/remote-mcp-server/thumb.png +launchweek: 'select-2025' +categories: + - launch-week +tags: + - select +date: '2025-10-03:10:00:00' +toc_depth: 2 +--- + +Today we are launching our remote MCP server, allowing you to connect your Supabase projects with _many_ more AI agents than before, including ChatGPT, Claude, and Builder.io. We also added support for MCP auth (OAuth2), a faster and more secure way to connect agents with your Supabase account (via browser-based authentication). Last but not least, we're adding official MCP support for local Supabase instances created through the [CLI](https://supabase.com/docs/guides/local-development/cli/getting-started). + +Now all you need is a single URL to connect your favorite AI agent to Supabase: + +``` +https://mcp.supabase.com/mcp +``` + +Or if you're running Supabase locally: + +```bash +http://localhost:54321/mcp +``` + +On top of this, we're adding even more tools to Supabase MCP that we hope will make you more productive. + +## What is MCP? + +MCP stands for [Model Context Protocol](https://modelcontextprotocol.io/). It standardizes how Large Language Models (LLMs) talk to platforms like Supabase. We released the initial version of our Supabase MCP server back in April which allowed folks to connect their favorite AI tools (like [Cursor](https://www.cursor.com/) or [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview)) directly with Supabase. Since launch, we've added many new features: + +- Fetching and deploying Edge Functions +- Fetching logs from any service in the Supabase stack +- Scoping the server to only one project +- Putting the server in read-only mode (implemented at the Postgres role level) + +Today we are adding even more tools to the tool belt, along with a new way to connect: Remote HTTP. + +## What is remote MCP? + +The MCP protocol supports 2 official methods for running servers, known as transports: + +- **stdio:** The MCP server runs directly on your local machine (using a runtime like `npx`) and communicates over a standard I/O interface. This was the transport used by most MCP servers originally, including Supabase. +- **Remote (HTTP):** The MCP server runs remotely over an HTTP web server. + +When we first launched the Supabase MCP server, the HTTP transport was going through some spec changes which many clients didn't support yet (streamable HTTP). We wanted to support all clients immediately without investing a ton of time into an unstable transport, so we released our server as an `stdio` MCP server. To run this, you needed to install Node.js and configuring your MCP client with this `npx` command: + +``` +npx -y @supabase/mcp-server-supabase@latest ... +``` + +This worked great at the time, because it meant that folks could connect their AI agents with Supabase immediately without a lot of infrastructure work on our end. But it came with some downsides: + +1. **Limited MCP clients:** Most web-based AI agents (like ChatGPT, Claude.ai, Builder.io) are limited to HTTP-based MCP servers due to the environments they run in. APIs like OpenAI's Response API also [have support for MCP](https://platform.openai.com/docs/guides/tools-remote-mcp) - but only with remote MCP servers, not `stdio`. +2. **Authentication was clunky:** Folks needed to manually generate a personal access token (PAT) in order to authenticate with their Supabase account which added friction to the setup experience and not very secure (it was easy to accidentally commit this to source control). +3. **Errors were hard to debug:** Not only did everyone need Node.js installed to run the server, they also needed to make sure their environment was configured correctly so that the correct version was used by each client (if you used `nvm`). Every operating system also had slight differences that required modifying the `npx` command accordingly. + +On the other hand, Remote MCP only requires a single URL: + +```bash +https://mcp.supabase.com/mcp + +# or http://localhost:54321/mcp for local +``` + +We also built an [interactive widget](https://supabase.com/mcp) to help you connect popular MCP clients to Supabase and customize the URL to your preferences (like project-scoped mode and read-only mode). + +## New features + +Our philosophy on Supabase MCP comes down to two ideas: + +1. Supabase MCP should be used for development. It was designed from the beginning to assist with app development and shouldn't be connected to production databases. See our post on [Defense in Depth for MCP Servers](https://supabase.com/blog/defense-in-depth-mcp). +2. MCP is just another way to access the same platform features that you already use in the web dashboard and CLI. But - since it's being used by an LLM, it should also lean into the strengths of an AI-first UX. + +With these in mind, we added the following new features to assist AI agents while they help build your app: + +- Feature groups +- Doc search +- Security and performance advisors +- Storage + +### Feature groups + +Feature groups allow you to pick and choose which tools you want to expose to your agent. This is useful in two ways: + +1. **Security:** if you know that you never want your agent to deploy edge functions, you can remove the `functions` feature group so that those tools are never exposed to the LLM. +2. **Tool limits:** many MCP clients limit the number of tools you can connect to them, so feature groups allow you to only connect the tools that you use regularly. + +Today we support the following feature groups: + +- [`account`](https://github.com/supabase-community/supabase-mcp#account) +- [`docs`](https://github.com/supabase-community/supabase-mcp#knowledge-base) +- [`database`](https://github.com/supabase-community/supabase-mcp#database) +- [`debugging`](https://github.com/supabase-community/supabase-mcp#debugging) +- [`development`](https://github.com/supabase-community/supabase-mcp#development) +- [`functions`](https://github.com/supabase-community/supabase-mcp#edge-functions) +- [`storage`](https://github.com/supabase-community/supabase-mcp#storage) +- [`branching`](https://github.com/supabase-community/supabase-mcp#branching-experimental-requires-a-paid-plan) + +See the [MCP docs](https://supabase.com/docs/guides/getting-started/mcp) for instructions on how to enable or disable these groups. + +### Doc search + +A big challenge with LLMs is knowledge cutoff. Early LLMs had a _pretty good_ understanding of Supabase, but it was still nowhere near complete or up-to-date. Now the latest leading LLMs have a _very good_ understanding of Supabase, but will still lag behind any new features, bug fixes, or other updates that we make. + +To help with this, we added a new tool to Supabase MCP: `search_docs`. This tool exposes the latest up-to-date Supabase docs powered by our Content API - a GraphQL based search API that uses [hybrid search](https://supabase.com/docs/guides/ai/hybrid-search) (semantic + keyword) to find relevant documentation for a given query (formatted as markdown). + +The result ends up looking like similar to [self-RAG](https://arxiv.org/abs/2310.11511): whenever your agent needs clarification on a topic, it can use this tool to find the most relevant Supabase documentation. + +### Security and performance advisors + +How do you know if LLMs are really following best coding practices? When a project reaches even a moderate level of complexity, the amount of context and moving parts becomes a real challenge to navigate, even for humans. + +Our solution is a feature that already exists on our platform - advisors. [Advisors](https://supabase.com/dashboard/project/_/advisors/security) are essentially lints on your database that help you follow security and performance best practices. We added a new `get_advisors` MCP tool that fetches these same advisors so that your agent can both discover and fix any outstanding issues on your database. + +### Storage + +We also added initial support for [Supabase Storage](https://supabase.com/docs/guides/storage) on our MCP server. This first version allows your agent to see which buckets exist on your project and update their configuration, but in the future we'll look into more abilities like listing files and their details. + +This feature was actually a community contribution (thanks [Nico](https://github.com/Ngineer101)!). If there are ever missing features that you'd like to see, [PR's](https://github.com/supabase-community/supabase-mcp/issues/new/choose) are always welcome! + +## What's next? + +We have more exciting plans for MCP at Supabase: + +1. **Security:** Today our OAuth2 implementation requires you to make a binary decision on permissions: either grant _all_ permissions to your MCP client, or _none_. This isn't ideal if you know that you never want to, say, allow your client to access to your Edge Functions. + + To improve this, we're working to support fine-grain permissions that can be toggled during authorization. It's a big task to re-work our permission infrastructure to support this, but we believe it's worth it. + +2. **Double down on local:** We're very excited to support local Supabase instances in this release, but we also believe there is a lot more that can be done. Supabase MCP is designed to be used for development, so we want the local experience to be first-class. + +3. **Build your own MCP:** You might have thought about building _your own_ MCP server on top of Supabase. We're using the playbook and lessons learned from our own MCP server to provide the tools you need to do the same - including remote MCP and auth. Stay tuned! + +We're keen to continue investing in MCP and excited to see how you use these new features! diff --git a/apps/www/_blog/2025-10-03-supabase-series-e.mdx b/apps/www/_blog/2025-10-03-supabase-series-e.mdx new file mode 100644 index 00000000000..ffcd572048c --- /dev/null +++ b/apps/www/_blog/2025-10-03-supabase-series-e.mdx @@ -0,0 +1,24 @@ +--- +title: 'Supabase Series E' +description: 'Raised funding from Accel, Peak XV, Figma, and existing investors.' +author: paul_copplestone +image: select/2025/announcing-series-e/og.png +thumb: select/2025/announcing-series-e/thumb.png +launchweek: 'select-2025' +categories: + - launch-week +tags: + - select +date: '2025-10-03:12:00:00' +toc_depth: 2 +--- + +Supabase has raised a Series E from insiders, led by Accel and Peak XV. Figma has joined the round with all of existing investors: YC, Coatue, Felicis, Craft, and Square Peg. + +We raised $120 at a $5B pre-money valuation. One of the ways we will use the money is for employee secondaries: every single round we have allowed our employees to sell 25% of their vested stock. This round is no different, and we will continue to do this for future rounds. + +Additionally, we are accelerating hiring for key open source initiatives like [Multigres](https://supabase.com/blog/multigres-vitess-for-postgres) and [OrioleDB](https://supabase.com/blog/supabase-acquires-oriole). Supabase is home to over 30 ex-founders. We are 100% distributed, with no offices, spread across 37 countries. We are a group of humans who are focused on doing their best work. If that sounds like a place you want to work, apply today: + +[supabase.com/careers](https://supabase.com/careers) + +One more thing: our community continues to grow it’s one of the things Ant & I are most proud of. This time, we wanted to allow Supabase and Postgres contributors to invest. In the coming months we will do a $1M community round open to early customers and contributors. diff --git a/apps/www/components/Announcement/Badge.tsx b/apps/www/components/Announcement/Badge.tsx index 052088e3e7e..41df7114f16 100644 --- a/apps/www/components/Announcement/Badge.tsx +++ b/apps/www/components/Announcement/Badge.tsx @@ -32,6 +32,7 @@ const AnnouncementBadge = ({ className={cn( ` announcement-link + text-nowrap group/announcement relative flex flex-row diff --git a/apps/www/components/Blog/BlogPostRenderer.tsx b/apps/www/components/Blog/BlogPostRenderer.tsx index 95cb9021e8a..aa9864665f0 100644 --- a/apps/www/components/Blog/BlogPostRenderer.tsx +++ b/apps/www/components/Blog/BlogPostRenderer.tsx @@ -127,9 +127,11 @@ const BlogPostRenderer = ({

    {label}

    -
    +
    {'title' in post && ( -

    {(post as { title?: string }).title}

    +

    + {(post as { title?: string }).title} +

    )} {'formattedDate' in post && (

    {(post as { formattedDate?: string }).formattedDate}

    @@ -306,7 +308,7 @@ const BlogPostRenderer = ({ formattedDate: string } } - label="Last post" + label="Previous post" /> )}
    diff --git a/apps/www/lib/authors.json b/apps/www/lib/authors.json index 6e5af52174d..60f1ec884e8 100644 --- a/apps/www/lib/authors.json +++ b/apps/www/lib/authors.json @@ -684,5 +684,12 @@ "position": "CSO", "author_url": "#", "author_image_url": "/images/blog/avatars/bilharmer.jpg" + }, + { + "author_id": "gregorykress", + "author": "Greg Kress", + "position": "Founder Advocate", + "author_url": "https://www.linkedin.com/in/gregorykress", + "author_image_url": "/images/blog/avatars/gregorykress.jpg" } ] diff --git a/apps/www/pages/terms.mdx b/apps/www/pages/terms.mdx index f9ea22db845..17f2839f1d7 100644 --- a/apps/www/pages/terms.mdx +++ b/apps/www/pages/terms.mdx @@ -12,7 +12,7 @@ export const meta = { _Last Modified: 11 July 2025_ -These Terms of Service (this "**Agreement**") are a binding contract between you ("**Customer**," "**you**," or "**your**") and Supabase, Inc., a Delaware corporation with offices located at 970 Toa Payoh North #07-04, Singapore 318992 ("**Supabase**," "**we**," or "**us**"). This Agreement governs your access to and use of the Cloud Services. Supabase and Customer may be referred to herein collectively as the "**Parties**" or individually as a "**Party**." +These Terms of Service (this "**Agreement**") are a binding contract between you ("**Customer**," "**you**," or "**your**") and Supabase, Inc., a Delaware corporation with offices located at 65 Chulia Street #38-02/03, OCBC Centre, Singapore 049513 ("**Supabase**," "**we**," or "**us**"). This Agreement governs your access to and use of the Cloud Services. Supabase and Customer may be referred to herein collectively as the "**Parties**" or individually as a "**Party**." ## Agreement Acceptance diff --git a/apps/www/public/images/blog/avatars/arkadiy-telegin.jpg b/apps/www/public/images/blog/avatars/arkadiy-telegin.jpg new file mode 100644 index 00000000000..2523f4741b8 Binary files /dev/null and b/apps/www/public/images/blog/avatars/arkadiy-telegin.jpg differ diff --git a/apps/www/public/images/blog/avatars/danny-jones.jpg b/apps/www/public/images/blog/avatars/danny-jones.jpg new file mode 100644 index 00000000000..86dad76dadc Binary files /dev/null and b/apps/www/public/images/blog/avatars/danny-jones.jpg differ diff --git a/apps/www/public/images/blog/avatars/dylan-allen.jpg b/apps/www/public/images/blog/avatars/dylan-allen.jpg new file mode 100644 index 00000000000..ab256392dd1 Binary files /dev/null and b/apps/www/public/images/blog/avatars/dylan-allen.jpg differ diff --git a/apps/www/public/images/blog/avatars/gregorykress.jpg b/apps/www/public/images/blog/avatars/gregorykress.jpg new file mode 100644 index 00000000000..23f605ffbd7 Binary files /dev/null and b/apps/www/public/images/blog/avatars/gregorykress.jpg differ diff --git a/apps/www/public/images/blog/avatars/omar-bewinxed.jpg b/apps/www/public/images/blog/avatars/omar-bewinxed.jpg new file mode 100644 index 00000000000..a0b803069a7 Binary files /dev/null and b/apps/www/public/images/blog/avatars/omar-bewinxed.jpg differ diff --git a/apps/www/public/images/blog/avatars/sidhant-kabra.jpg b/apps/www/public/images/blog/avatars/sidhant-kabra.jpg new file mode 100644 index 00000000000..39cfc127b6a Binary files /dev/null and b/apps/www/public/images/blog/avatars/sidhant-kabra.jpg differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/cekura.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/cekura.png new file mode 100644 index 00000000000..d438c705b36 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/cekura.png differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/cheers.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/cheers.png new file mode 100644 index 00000000000..2f7f11625ca Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/cheers.png differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/leaping-ai.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/leaping-ai.png new file mode 100644 index 00000000000..d14d9d558b6 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/leaping-ai.png differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/og.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/og.png new file mode 100644 index 00000000000..77f48cb7825 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/og.png differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/thumb.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/thumb.png new file mode 100644 index 00000000000..29f6414c1c1 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/thumb.png differ diff --git a/apps/www/public/images/blog/select/2025/1000-yc-companies/zaymo.png b/apps/www/public/images/blog/select/2025/1000-yc-companies/zaymo.png new file mode 100644 index 00000000000..8c858ddfc72 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/1000-yc-companies/zaymo.png differ diff --git a/apps/www/public/images/blog/select/2025/announcing-series-e/og.png b/apps/www/public/images/blog/select/2025/announcing-series-e/og.png new file mode 100644 index 00000000000..11b340d5a77 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/announcing-series-e/og.png differ diff --git a/apps/www/public/images/blog/select/2025/announcing-series-e/thumb.png b/apps/www/public/images/blog/select/2025/announcing-series-e/thumb.png new file mode 100644 index 00000000000..e5f6e3d7dea Binary files /dev/null and b/apps/www/public/images/blog/select/2025/announcing-series-e/thumb.png differ diff --git a/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/og.png b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/og.png new file mode 100644 index 00000000000..b219feaad63 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/og.png differ diff --git a/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/thumb.png b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/thumb.png new file mode 100644 index 00000000000..6d3099a763b Binary files /dev/null and b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/thumb.png differ diff --git a/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-bewinxed.png b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-bewinxed.png new file mode 100644 index 00000000000..a06f8359d4c Binary files /dev/null and b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-bewinxed.png differ diff --git a/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-nickfrosty.png b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-nickfrosty.png new file mode 100644 index 00000000000..1c20cafeb07 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/login-w-solana-ethereum/twitter-nickfrosty.png differ diff --git a/apps/www/public/images/blog/select/2025/remote-mcp-server/og.png b/apps/www/public/images/blog/select/2025/remote-mcp-server/og.png new file mode 100644 index 00000000000..24f575e6f3e Binary files /dev/null and b/apps/www/public/images/blog/select/2025/remote-mcp-server/og.png differ diff --git a/apps/www/public/images/blog/select/2025/remote-mcp-server/thumb.png b/apps/www/public/images/blog/select/2025/remote-mcp-server/thumb.png new file mode 100644 index 00000000000..2b8330ba3b6 Binary files /dev/null and b/apps/www/public/images/blog/select/2025/remote-mcp-server/thumb.png differ diff --git a/docker/.env.example b/docker/.env.example index 8ee5f75c680..63f2b2702a5 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -11,6 +11,7 @@ DASHBOARD_USERNAME=supabase DASHBOARD_PASSWORD=this_password_is_insecure_and_should_be_updated SECRET_KEY_BASE=UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq VAULT_ENC_KEY=your-encryption-key-32-chars-min +PG_META_CRYPTO_KEY=your-encryption-key-32-chars-min ############ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9361659aed6..6d9192bd593 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -30,6 +30,7 @@ services: environment: STUDIO_PG_META_URL: http://meta:8080 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + PG_META_CRYPTO_KEY: ${PG_META_CRYPTO_KEY} DEFAULT_ORGANIZATION_NAME: ${STUDIO_DEFAULT_ORGANIZATION} DEFAULT_PROJECT_NAME: ${STUDIO_DEFAULT_PROJECT} @@ -311,6 +312,7 @@ services: PG_META_DB_NAME: ${POSTGRES_DB} PG_META_DB_USER: supabase_admin PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD} + CRYPTO_KEY: ${PG_META_CRYPTO_KEY} functions: container_name: supabase-edge-functions diff --git a/package.json b/package.json index e9e46dc1856..9b1126f1273 100644 --- a/package.json +++ b/package.json @@ -62,33 +62,10 @@ "type": "git", "url": "git+https://github.com/supabase/supabase.git" }, - "pnpm": { - "overrides": { - "@supabase/supabase-js>@supabase/auth-js": "catalog:", - "@tanstack/directive-functions-plugin>vite": "catalog:", - "@tanstack/react-start-plugin>vite": "catalog:", - "esbuild": "^0.25.2", - "@redocly/respect-core>form-data": "^4.0.4", - "tmp": "^0.2.4" - }, - "neverBuiltDependencies": [ - "libpg-query" - ] - }, "engines": { - "pnpm": ">=10.16", + "pnpm": "10.18", "node": ">=22" }, - "keywords": [ - "postgres", - "firebase", - "storage", - "functions", - "database", - "auth" - ], - "packageManager": "pnpm@10.16.1", - "dependencies": { - "@supabase/auth-js": "2.73.0-rc.5" - } + "keywords": ["postgres", "firebase", "storage", "functions", "database", "auth"], + "packageManager": "pnpm@10.18.0" } diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts index 6a725ff72bd..e15025b4759 100644 --- a/packages/api-types/types/api.d.ts +++ b/packages/api-types/types/api.d.ts @@ -295,6 +295,90 @@ export interface paths { patch?: never trace?: never } + '/v1/projects/{ref}/actions': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * List all action runs + * @description Returns a paginated list of action runs of the specified project. + */ + get: operations['v1-list-action-runs'] + put?: never + post?: never + delete?: never + options?: never + /** + * Count the number of action runs + * @description Returns the total number of action runs of the specified project. + */ + head: operations['v1-count-action-runs'] + patch?: never + trace?: never + } + '/v1/projects/{ref}/actions/{run_id}': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Get the status of an action run + * @description Returns the current status of the specified action run. + */ + get: operations['v1-get-action-run'] + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v1/projects/{ref}/actions/{run_id}/logs': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** + * Get the logs of an action run + * @description Returns the logs from the specified action run. + */ + get: operations['v1-get-action-run-logs'] + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } + '/v1/projects/{ref}/actions/{run_id}/status': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get?: never + put?: never + post?: never + delete?: never + options?: never + head?: never + /** + * Update the status of an action run + * @description Updates the status of an ongoing action run. + */ + patch: operations['v1-update-action-run-status'] + trace?: never + } '/v1/projects/{ref}/advisors/performance': { parameters: { query?: never @@ -1683,6 +1767,23 @@ export interface paths { export type webhooks = Record export interface components { schemas: { + ActionRunResponse: { + branch_id: string + check_run_id: number | null + created_at: string + git_config?: unknown + id: string + run_steps: { + created_at: string + /** @enum {string} */ + name: 'clone' | 'pull' | 'health' | 'configure' | 'migrate' | 'seed' | 'deploy' + /** @enum {string} */ + status: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + updated_at: string + }[] + updated_at: string + workdir: string | null + } ActivateVanitySubdomainResponse: { custom_domain: string } @@ -2534,6 +2635,23 @@ export interface components { LegacyApiKeysResponse: { enabled: boolean } + ListActionRunResponse: { + branch_id: string + check_run_id: number | null + created_at: string + git_config?: unknown + id: string + run_steps: { + created_at: string + /** @enum {string} */ + name: 'clone' | 'pull' | 'health' | 'configure' | 'migrate' | 'seed' | 'deploy' + /** @enum {string} */ + status: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + updated_at: string + }[] + updated_at: string + workdir: string | null + }[] ListProjectAddonsResponse: { available_addons: { name: string @@ -2764,7 +2882,7 @@ export interface components { * @description Resource indicator for MCP (Model Context Protocol) clients * @enum {string} */ - resource?: 'http://localhost:8080/mcp' | 'http://localhost:8080/mcp' + resource?: 'https://api.supabase.green/mcp' | 'https://mcp.supabase.green/mcp' } OAuthTokenResponse: { access_token: string @@ -3465,6 +3583,26 @@ export interface components { } updated_at?: string } + UpdateRunStatusBody: { + /** @enum {string} */ + clone?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + configure?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + deploy?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + health?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + migrate?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + pull?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + /** @enum {string} */ + seed?: 'CREATED' | 'DEAD' | 'EXITED' | 'PAUSED' | 'REMOVING' | 'RESTARTING' | 'RUNNING' + } + UpdateRunStatusResponse: { + /** @enum {string} */ + message: 'ok' + } UpdateSigningKeyBody: { /** @enum {string} */ status: 'in_use' | 'previously_used' | 'revoked' | 'standby' @@ -4142,7 +4280,7 @@ export interface operations { organization_slug?: string redirect_uri: string /** @description Resource indicator for MCP (Model Context Protocol) clients */ - resource?: 'http://localhost:8080/mcp' | 'http://localhost:8080/mcp' + resource?: 'https://api.supabase.green/mcp' | 'https://mcp.supabase.green/mcp' response_mode?: string response_type: 'code' | 'token' | 'id_token token' scope?: string @@ -4596,6 +4734,269 @@ export interface operations { } } } + 'v1-list-action-runs': { + parameters: { + query?: { + limit?: number + offset?: number + } + header?: never + path: { + /** @description Project ref */ + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ListActionRunResponse'] + } + } + /** @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 action runs */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + 'v1-count-action-runs': { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + /** @description total count value */ + 'X-Total-Count'?: number + [name: string]: unknown + } + 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 + } + /** @description Failed to count action runs */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + 'v1-get-action-run': { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + /** @description Action Run ID */ + run_id: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ActionRunResponse'] + } + } + /** @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 get action run status */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + 'v1-get-action-run-logs': { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + /** @description Action Run ID */ + run_id: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'text/plain': string + } + } + /** @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 get action run logs */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + 'v1-update-action-run-status': { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + /** @description Action Run ID */ + run_id: string + } + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['UpdateRunStatusBody'] + } + } + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['UpdateRunStatusResponse'] + } + } + /** @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 update action run status */ + 500: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } 'v1-get-performance-advisors': { parameters: { query?: never diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts index 2462a6906b0..c9740d003ab 100644 --- a/packages/api-types/types/platform.d.ts +++ b/packages/api-types/types/platform.d.ts @@ -11,14 +11,14 @@ export interface paths { path?: never cookie?: never } - /** Gets GoTrue config */ + /** Gets Auth config */ get: operations['GoTrueConfigController_getGoTrueConfig'] put?: never post?: never delete?: never options?: never head?: never - /** Updates GoTrue config */ + /** Updates Auth config */ patch: operations['GoTrueConfigController_updateGoTrueConfig'] trace?: never } @@ -35,7 +35,7 @@ export interface paths { delete?: never options?: never head?: never - /** Updates GoTrue config hooks */ + /** Updates Auth config hooks */ patch: operations['GoTrueConfigController_updateGoTrueConfigHooks'] trace?: never } @@ -114,7 +114,7 @@ export interface paths { path?: never cookie?: never } - /** Gets GoTrue template */ + /** Gets Auth template */ get: operations['TemplateController_getTemplate'] put?: never post?: never @@ -2619,7 +2619,10 @@ export interface paths { path?: never cookie?: never } - /** Gets project's pgbouncer config */ + /** + * Gets project's pgbouncer config + * @description Returns pgbouncer config. To check pgbouncer status, use `GET /v0/projects/{ref}/config/pgbouncer/status` + */ get: operations['PgbouncerConfigController_getPgbouncerConfig'] put?: never post?: never @@ -3034,6 +3037,23 @@ export interface paths { patch?: never trace?: never } + '/platform/projects/{ref}/members': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + /** Gets the list of users with access to the project */ + get: operations['ProjectMembersController_getProjecMembers'] + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } '/platform/projects/{ref}/notifications/advisor/exceptions': { parameters: { query?: never @@ -4905,7 +4925,7 @@ export interface components { | { billing_email: string | null /** @enum {string|null} */ - billing_partner: 'fly' | 'aws' | 'aws_marketplace' | 'vercel_marketplace' | null + billing_partner: 'fly' | 'aws_marketplace' | 'vercel_marketplace' | null id: number is_owner: boolean name: string @@ -6036,7 +6056,7 @@ export interface components { }[] billing_cycle_anchor: number /** @enum {string} */ - billing_partner?: 'fly' | 'aws' | 'aws_marketplace' | 'vercel_marketplace' + billing_partner?: 'fly' | 'aws_marketplace' | 'vercel_marketplace' billing_via_partner: boolean cached_egress_enabled: boolean current_period_end: number @@ -6904,7 +6924,7 @@ export interface components { OrganizationResponse: { billing_email: string | null /** @enum {string|null} */ - billing_partner: 'fly' | 'aws' | 'aws_marketplace' | 'vercel_marketplace' | null + billing_partner: 'fly' | 'aws_marketplace' | 'vercel_marketplace' | null id: number is_owner: boolean name: string @@ -6958,7 +6978,7 @@ export interface components { OrganizationSlugResponse: { billing_email: string | null /** @enum {string|null} */ - billing_partner: 'fly' | 'aws' | 'aws_marketplace' | 'vercel_marketplace' | null + billing_partner: 'fly' | 'aws_marketplace' | 'vercel_marketplace' | null has_oriole_project: boolean id: number name: string @@ -7140,8 +7160,6 @@ export interface components { max_client_conn?: number pgbouncer_enabled: boolean /** @enum {string} */ - pgbouncer_status: 'COMING_UP' | 'COMING_DOWN' | 'RELOADING' | 'ENABLED' | 'DISABLED' - /** @enum {string} */ pool_mode: 'transaction' | 'session' | 'statement' query_wait_timeout?: number reserve_pool_size?: number @@ -7742,6 +7760,13 @@ export interface components { status: string subscription_id: string | null } + ProjectMembersResponse: { + members: { + primary_email: string + user_id: string + username: string + }[] + } ProjectRefResponse: { id: number name: string @@ -7965,7 +7990,7 @@ export interface components { }[] } ReplicationPipelineReplicationStatusResponse: { - /** @description The apply worker lag */ + /** @description Stats about apply worker lag */ apply_lag?: { /** * @description Bytes between the current WAL location and the confirmed flush LSN. @@ -8052,7 +8077,7 @@ export interface components { * @example public.orders */ table_name: string - /** @description The table sync worker lag */ + /** @description Stats about table sync worker lag */ table_sync_lag?: { /** * @description Bytes between the current WAL location and the confirmed flush LSN. @@ -9957,7 +9982,7 @@ export interface operations { } content?: never } - /** @description Failed to retrieve GoTrue config */ + /** @description Failed to retrieve Auth config */ 500: { headers: { [name: string]: unknown @@ -10011,7 +10036,7 @@ export interface operations { } content?: never } - /** @description Failed to update GoTrue config */ + /** @description Failed to update Auth config */ 500: { headers: { [name: string]: unknown @@ -10065,7 +10090,7 @@ export interface operations { } content?: never } - /** @description Failed to update GoTrue config hooks */ + /** @description Failed to update Auth config hooks */ 500: { headers: { [name: string]: unknown @@ -10306,7 +10331,7 @@ export interface operations { } content?: never } - /** @description Failed to retrieve GoTrue template */ + /** @description Failed to retrieve Auth template */ 500: { headers: { [name: string]: unknown @@ -21440,34 +21465,21 @@ export interface operations { attribute: | 'total_realtime_requests' | 'total_realtime_egress' - | 'total_ingress' | 'total_egress' | 'total_cached_egress' | 'total_requests' - | 'total_get_requests' - | 'total_patch_requests' - | 'total_post_requests' | 'total_delete_requests' | 'total_supavisor_egress_bytes' - | 'total_rest_ingress' | 'total_rest_egress' | 'total_rest_requests' - | 'total_rest_get_requests' - | 'total_rest_post_requests' - | 'total_rest_patch_requests' - | 'total_rest_delete_requests' | 'total_auth_billing_period_mau' | 'total_auth_billing_period_sso_mau' | 'total_auth_egress' | 'total_auth_requests' - | 'total_auth_delete_requests' | 'total_storage_ingress' | 'total_storage_egress' | 'total_storage_image_render_count' | 'total_storage_requests' - | 'total_storage_get_requests' - | 'total_storage_post_requests' - | 'total_storage_delete_requests' | 'total_logdrain_egress' | 'total_func_invocations' | 'total_func_cpu_time_ms' @@ -22119,6 +22131,49 @@ export interface operations { } } } + ProjectMembersController_getProjecMembers: { + parameters: { + query?: never + header?: never + path: { + /** @description Project ref */ + ref: string + } + cookie?: never + } + requestBody?: never + responses: { + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ProjectMembersResponse'] + } + } + /** @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 + } + } + } ProjectAdvisorNotificationsController_listNotificationExceptions: { parameters: { query?: never diff --git a/packages/common/telemetry-constants.ts b/packages/common/telemetry-constants.ts index f12911ecde7..facb0c6d658 100644 --- a/packages/common/telemetry-constants.ts +++ b/packages/common/telemetry-constants.ts @@ -1189,6 +1189,35 @@ export interface AiAssistantInSupportFormClickedEvent { groups: Partial } +/** + * User rated an AI assistant message with thumbs up or thumbs down. + * + * @group Events + * @source studio + */ +export interface AssistantMessageRatingSubmittedEvent { + action: 'assistant_message_rating_submitted' + properties: { + /** + * The rating given by the user: positive (thumbs up) or negative (thumbs down) + */ + rating: 'positive' | 'negative' + /** + * The category of the conversation + */ + category: + | 'sql_generation' + | 'schema_design' + | 'rls_policies' + | 'edge_functions' + | 'database_optimization' + | 'debugging' + | 'general_help' + | 'other' + } + groups: TelemetryGroups +} + /** * User copied the command for a Supabase UI component. * @@ -1871,6 +1900,7 @@ export type TelemetryEvent = | AssistantSuggestionRunQueryClickedEvent | AssistantSqlDiffHandlerEvaluatedEvent | AssistantEditInSqlEditorClickedEvent + | AssistantMessageRatingSubmittedEvent | DocsFeedbackClickedEvent | HomepageFrameworkQuickstartClickedEvent | HomepageProductCardClickedEvent diff --git a/packages/ui-patterns/src/Banners/SelectBanner.tsx b/packages/ui-patterns/src/Banners/SelectBanner.tsx index 0a763f25185..7c67ab9a9fd 100644 --- a/packages/ui-patterns/src/Banners/SelectBanner.tsx +++ b/packages/ui-patterns/src/Banners/SelectBanner.tsx @@ -3,8 +3,12 @@ import Link from 'next/link' export function SelectBanner() { const selectSiteUrl = 'https://select.supabase.com/' - const desc = ['Our first user conference', 'Oct 3 2025', 'Guillermo Rauch, Dylan Field, and more'] - const cta = 'Save your seat' + const desc = [ + 'Our first user conference', + 'Oct 3 2025', + 'Patrick Collison, Dylan Field, and more', + ] + const cta = 'Watch replay' const baseStyles = 'flex flex-col justify-center border-l border-muted py-8 ' const textBlockStyles = diff --git a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx index 709130225f3..c6463094a94 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx @@ -1,14 +1,15 @@ 'use client' import React, { useMemo, useState } from 'react' -import { cn, Separator } from 'ui' +import { cn, Separator, CodeBlock } from 'ui' import { ClientSelectDropdown } from './components/ClientSelectDropdown' import { McpConfigurationDisplay } from './components/McpConfigurationDisplay' import { McpConfigurationOptions } from './components/McpConfigurationOptions' -import { FEATURE_GROUPS_PLATFORM, FEATURE_GROUPS_NON_PLATFORM, MCP_CLIENTS } from './constants' +import { FEATURE_GROUPS_NON_PLATFORM, FEATURE_GROUPS_PLATFORM, MCP_CLIENTS } from './constants' import type { McpClient } from './types' import { getMcpUrl } from './utils/getMcpUrl' +import { InfoTooltip } from '../info-tooltip' export interface McpConfigPanelProps { basePath: string @@ -43,7 +44,7 @@ export function McpConfigPanel({ ) }, [selectedFeatures, supportedFeatures]) - const { clientConfig } = getMcpUrl({ + const { mcpUrl, clientConfig } = getMcpUrl({ projectRef, isPlatform, apiUrl, @@ -78,6 +79,24 @@ export function McpConfigPanel({ onFeaturesChange={setSelectedFeatures} featureGroups={isPlatform ? FEATURE_GROUPS_PLATFORM : FEATURE_GROUPS_NON_PLATFORM} /> +
    + + Server URL + + {`MCP clients should support the Streamable HTTP transport${isPlatform ? ' and OAuth 2.1 with dynamic client registration' : ''}`} + +
    + } + hideLineNumbers + language="http" + className="max-h-64 overflow-y-auto" + > + {mcpUrl} + +
    - + diff --git a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx index 5ea38d01fe6..6d4ba541437 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx @@ -65,6 +65,7 @@ export function McpConfigurationDisplay({ value={JSON.stringify(clientConfig, null, 2)} language="json" className="max-h-64 overflow-y-auto" + focusable={false} /> {selectedClient.alternateInstructions && selectedClient.alternateInstructions(clientConfig)} diff --git a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationOptions.tsx b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationOptions.tsx index 7d71e8a8f91..ad0dccaf2ab 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationOptions.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationOptions.tsx @@ -34,19 +34,17 @@ export function McpConfigurationOptions({ return (
    {/* Readonly Mode */} - {isPlatform && ( -
    -
    - - Only allow read operations on your database -
    -
    - -
    +
    +
    + + Only allow read operations on your database
    - )} +
    + +
    +
    {/* Feature Groups */}
    diff --git a/packages/ui-patterns/src/McpUrlBuilder/constants.tsx b/packages/ui-patterns/src/McpUrlBuilder/constants.tsx index 67f6e7c8875..dd32ba408a7 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/constants.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/constants.tsx @@ -3,7 +3,6 @@ import type { ClaudeCodeMcpConfig, McpClient, McpFeatureGroup, - OtherMcpConfig, VSCodeMcpConfig, WindsurfMcpConfig, } from './types' @@ -12,7 +11,7 @@ export const FEATURE_GROUPS_PLATFORM: McpFeatureGroup[] = [ { id: 'docs', name: 'Documentation', - description: 'Access project documentation and guides', + description: 'Access Supabase documentation and guides', }, { id: 'account', @@ -151,29 +150,6 @@ export const MCP_CLIENTS: McpClient[] = [ ) }, }, - { - key: 'other', - label: 'Other', - transformConfig: (config): OtherMcpConfig => { - return { - mcpServers: { - supabase: { - type: 'http', - url: config.mcpServers.supabase.url, - }, - }, - } - }, - alternateInstructions: (_config) => { - return ( -

    - These generic MCP settings may work with other MCP clients, but there are no guarantees, - due to differences between clients. Refer to your specific client docs for where to input - the configuration. -

    - ) - }, - }, ] export const DEFAULT_MCP_URL_PLATFORM = 'http://localhost:8080/mcp' diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpUrl.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpUrl.ts index 94dc41f8cb7..e7ff07dad69 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpUrl.ts +++ b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpUrl.ts @@ -28,7 +28,7 @@ export function getMcpUrl({ if (projectRef && isPlatform) { url.searchParams.set('project_ref', projectRef) } - if (readonly && isPlatform) { + if (readonly) { url.searchParams.set('read_only', 'true') } if (features.length > 0) { diff --git a/packages/ui/src/components/Input/Input.tsx b/packages/ui/src/components/Input/Input.tsx index 35f21c2aa8a..d895037d2e0 100644 --- a/packages/ui/src/components/Input/Input.tsx +++ b/packages/ui/src/components/Input/Input.tsx @@ -38,7 +38,7 @@ export interface Props } /** - * @deprecated Use `import { Input_shadcn_ } from "ui"` instead or ./ui-patterns/data-inputs/input + * @deprecated Use `import { Input_Shadcn_ } from 'ui'` instead or `import { Input } from 'ui-patterns/DataInputs/Input'` */ function Input({ autoComplete, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b218f81fe12..1f261e940f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,18 +43,18 @@ catalogs: specifier: ^1.12.0 version: 1.12.0 vite: - specifier: ^6.2.7 - version: 6.3.5 + specifier: ^6.3.6 + version: 6.3.6 zod: specifier: ^3.25.76 version: 3.25.76 overrides: - '@supabase/supabase-js>@supabase/auth-js': 2.73.0-rc.5 - '@tanstack/directive-functions-plugin>vite': ^6.2.7 - '@tanstack/react-start-plugin>vite': ^6.2.7 - esbuild: ^0.25.2 '@redocly/respect-core>form-data': ^4.0.4 + '@supabase/supabase-js>@supabase/auth-js': 2.72.0-rc.11 + '@tanstack/directive-functions-plugin>vite': ^6.3.6 + '@tanstack/react-start-plugin>vite': ^6.3.6 + esbuild: ^0.25.2 tmp: ^0.2.4 importers: @@ -201,8 +201,8 @@ importers: specifier: 'catalog:' version: 18.3.1(react@18.3.1) sharp: - specifier: 0.32.6 - version: 0.32.6 + specifier: ~0.34.0 + version: 0.34.3 tailwind-merge: specifier: ^1.13.2 version: 1.14.0 @@ -708,10 +708,10 @@ importers: version: 5.1.3 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) + version: 4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) @@ -852,7 +852,7 @@ importers: version: 2.1.0(@aws-sdk/credential-provider-web-identity@3.830.0) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) + version: 4.3.4(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) '@zip.js/zip.js': specifier: ^2.7.29 version: 2.7.30 @@ -880,6 +880,9 @@ importers: cronstrue: specifier: ^2.50.0 version: 2.50.0 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 dayjs: specifier: ^1.11.10 version: 1.11.13 @@ -941,8 +944,8 @@ importers: specifier: ^0.3.0 version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nuqs: - specifier: ^2.4.1 - version: 2.4.1(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: 2.7.1 + version: 2.7.1(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) openai: specifier: ^4.75.1 version: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76) @@ -1048,6 +1051,9 @@ importers: sqlstring: specifier: ^2.3.2 version: 2.3.3 + streamdown: + specifier: ^1.3.0 + version: 1.3.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1) tus-js-client: specifier: ^4.1.0 version: 4.1.0 @@ -1115,6 +1121,9 @@ importers: '@types/common-tags': specifier: ^1.8.1 version: 1.8.4 + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 '@types/file-saver': specifier: ^2.0.2 version: 2.0.5 @@ -1240,10 +1249,10 @@ importers: version: 5.9.2 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) + version: 4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) @@ -1339,7 +1348,7 @@ importers: version: 1.1.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-router/fs-routes': specifier: ^7.4.0 - version: 7.4.0(@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2) + version: 7.4.0(@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2) '@supabase/postgrest-js': specifier: '*' version: 1.19.2 @@ -1353,8 +1362,8 @@ importers: specifier: ^5.83.0 version: 5.83.0(react@18.3.1) axios: - specifier: ^1.11.0 - version: 1.11.0 + specifier: ^1.12.0 + version: 1.12.2 class-variance-authority: specifier: '*' version: 0.6.1 @@ -1460,7 +1469,7 @@ importers: devDependencies: '@react-router/dev': specifier: ^7.1.5 - version: 7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1) + version: 7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1) '@shikijs/compat': specifier: ^1.1.7 version: 1.6.0 @@ -1475,7 +1484,7 @@ importers: version: 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': specifier: ^1.114.25 - version: 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1) + version: 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1) '@types/common-tags': specifier: ^1.8.4 version: 1.8.4 @@ -1529,7 +1538,7 @@ importers: version: 5.9.2 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) apps/www: dependencies: @@ -1818,7 +1827,7 @@ importers: version: 1.15.4 nuxt: specifier: ^4.0.3 - version: 4.1.2(@electric-sql/pglite@0.2.15)(@parcel/watcher@2.5.1)(@types/node@22.13.14)(@vue/compiler-sfc@3.5.21)(aws4fetch@1.0.20)(db0@0.3.2(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(eslint@8.57.0(supports-color@8.1.1))(ioredis@5.7.0(supports-color@8.1.1))(magicast@0.3.5)(rollup@4.50.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + version: 4.1.2(@electric-sql/pglite@0.2.15)(@parcel/watcher@2.5.1)(@types/node@22.13.14)(@vue/compiler-sfc@3.5.21)(aws4fetch@1.0.20)(db0@0.3.2(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(eslint@8.57.0(supports-color@8.1.1))(ioredis@5.7.0(supports-color@8.1.1))(magicast@0.3.5)(rollup@4.50.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) devDependencies: shadcn: specifier: ^2.10.0 @@ -1828,7 +1837,7 @@ importers: version: link:../../packages/tsconfig vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) e2e/studio: dependencies: @@ -1907,7 +1916,7 @@ importers: version: 5.9.2 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) @@ -2134,7 +2143,7 @@ importers: version: 5.9.2 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) @@ -2376,7 +2385,7 @@ importers: version: 5.9.2 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) @@ -2563,7 +2572,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + version: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) vitest: specifier: ^3.0.5 version: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) @@ -2647,10 +2656,16 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/ni@23.3.1': resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} hasBin: true + '@antfu/utils@9.2.1': + resolution: {integrity: sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==} + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} @@ -3350,6 +3365,9 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -3359,6 +3377,21 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -4272,6 +4305,12 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} deprecated: Use @eslint/object-schema instead + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + '@img/sharp-darwin-arm64@0.34.3': resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -4298,92 +4337,78 @@ packages: resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.0': resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.0': resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.0': resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.0': resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.0': resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.0': resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.3': resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.3': resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.3': resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.3': resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.3': resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.3': resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.3': resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.3': resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} @@ -4691,6 +4716,9 @@ packages: peerDependencies: react: '>=16' + '@mermaid-js/parser@0.6.2': + resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} + '@mertasan/tailwindcss-variables@2.7.0': resolution: {integrity: sha512-rKPhxi/0r6XWP0+OjPmsfrloX/TtQmvONj2Pr3Nl8BNBznQVP3M9sphguDBUDC0AiKYx2xgup3XzAhlIDLPLIA==} engines: {node: '>=12.13.0'} @@ -4814,28 +4842,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@15.5.2': resolution: {integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@15.5.2': resolution: {integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@15.5.2': resolution: {integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@15.5.2': resolution: {integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==} @@ -5456,42 +5480,36 @@ packages: engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-minify/binding-linux-arm64-musl@0.87.0': resolution: {integrity: sha512-pgWeYfSprtpnJVea9Q5eI6Eo80lDGlMw2JdcSMXmShtBjEhBl6bvDNHlV+6kNfh7iT65y/uC6FR8utFrRghu8A==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-minify/binding-linux-riscv64-gnu@0.87.0': resolution: {integrity: sha512-O1QPczlT+lqNZVeKOdFxxL+s1RIlnixaJYFLrcqDcRyn82MGKLz7sAenBTFRQoIfLnSxtMGL6dqHOefYkQx7Cg==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-minify/binding-linux-s390x-gnu@0.87.0': resolution: {integrity: sha512-tcwt3ZUWOKfNLXN2edxFVHMlIuPvbuyMaKmRopgljSCfFcNHWhfTNlxlvmECRNhuQ91EcGwte6F1dwoeMCNd7A==} engines: {node: '>=14.0.0'} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-minify/binding-linux-x64-gnu@0.87.0': resolution: {integrity: sha512-Xf4AXF14KXUzSnfgTcFLFSM0TykJhFw14+xwNvlAb6WdqXAKlMrz9joIAezc8dkW1NNscCVTsqBUPJ4RhvCM1Q==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-minify/binding-linux-x64-musl@0.87.0': resolution: {integrity: sha512-LIqvpx9UihEW4n9QbEljDnfUdAWqhr6dRqmzSFwVAeLZRUECluLCDdsdwemrC/aZkvnisA4w0LFcFr3HmeTLJg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@oxc-minify/binding-wasm32-wasi@0.87.0': resolution: {integrity: sha512-h0xluvc+YryfH5G5dndjGHuA/D4Kp85EkPMxqoOjNudOKDCtdobEaC9horhCqnOOQ0lgn+PGFl3w8u4ToOuRrA==} @@ -5551,42 +5569,36 @@ packages: engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.87.0': resolution: {integrity: sha512-tBPkSPgRSSbmrje8CUovISi/Hj/tWjZJ3n/qnrjx2B+u86hWtwLsngtPDQa5d4seSyDaHSx6tNEUcH7+g5Ee0Q==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-riscv64-gnu@0.87.0': resolution: {integrity: sha512-z4UKGM4wv2wEAQAlx2pBq6+pDJw5J/5oDEXqW6yBSLbWLjLDo4oagmRSE3+giOWteUa+0FVJ+ypq4iYxBkYSWg==} engines: {node: '>=20.0.0'} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-s390x-gnu@0.87.0': resolution: {integrity: sha512-6W1ENe/nZtr2TBnrEzmdGEraEAdZOiH3YoUNNeQWuqwLkmpoHTJJdclieToPe/l2IKJ4WL3FsSLSGHE8yt/OEg==} engines: {node: '>=20.0.0'} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.87.0': resolution: {integrity: sha512-s3kB/Ii3X3IOZ27Iu7wx2zYkIcDO22Emu32SNC6kkUSy09dPBc1yaW14TnAkPMe/rvtuzR512JPWj3iGpl+Dng==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.87.0': resolution: {integrity: sha512-3+M9hfrZSDi4+Uy4Ll3rtOuVG3IHDQlj027jgtmAAHJK1eqp4CQfC7rrwE+LFUqUwX+KD2GwlxR+eHyyEf5Gbg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@oxc-parser/binding-wasm32-wasi@0.87.0': resolution: {integrity: sha512-2jgeEeOa4GbQQg2Et/gFTgs5wKS/+CxIg+CN2mMOJ4EqbmvUVeGiumO01oFOWTYnJy1oONwIocBzrnMuvOcItA==} @@ -5649,42 +5661,36 @@ packages: engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.87.0': resolution: {integrity: sha512-MZ1/TNaebhXK73j1UDfwyBFnAy0tT3n6otOkhlt1vlJwqboUS/D7E/XrCZmAuHIfVPxAXRPovkl7kfxLB43SKw==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.87.0': resolution: {integrity: sha512-JCWE6n4Hicu0FVbvmLdH/dS8V6JykOUsbrbDYm6JwFlHr4eFTTlS2B+mh5KPOxcdeOlv/D/XRnvMJ6WGYs25EA==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.87.0': resolution: {integrity: sha512-n2NTgM+3PqFagJV9UXRDNOmYesF+TO9SF9FeHqwVmW893ayef9KK+vfWAAhvOYHXYaKWT5XoHd87ODD7nruyhw==} engines: {node: '>=14.0.0'} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.87.0': resolution: {integrity: sha512-ZOKW3wx0bW2O7jGdOzr8DyLZqX2C36sXvJdsHj3IueZZ//d/NjLZqEiUKz+q0JlERHtCVKShQ5PLaCx7NpuqNg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.87.0': resolution: {integrity: sha512-eIspx/JqkVMPK1CAYEOo2J8o49s4ZTf+32MSMUknIN2ZS1fvRmWS0D/xFFaLP/9UGhdrXRIPbn/iSYEA8JnV/g==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@oxc-transform/binding-wasm32-wasi@0.87.0': resolution: {integrity: sha512-4uRjJQnt/+kmJUIC6Iwzn+MqqZhLP1zInPtDwgL37KI4VuUewUQWoL+sggMssMEgm7ZJwOPoZ6piuSWwMgOqgQ==} @@ -5732,42 +5738,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-wasm@2.3.0': resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} @@ -8064,133 +8064,111 @@ packages: resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.50.2': resolution: {integrity: sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.38.0': resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm-musleabihf@4.50.2': resolution: {integrity: sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.38.0': resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.50.2': resolution: {integrity: sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.38.0': resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-musl@4.50.2': resolution: {integrity: sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.50.2': resolution: {integrity: sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loongarch64-gnu@4.38.0': resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.50.2': resolution: {integrity: sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.38.0': resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.50.2': resolution: {integrity: sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.38.0': resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-musl@4.50.2': resolution: {integrity: sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.38.0': resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.50.2': resolution: {integrity: sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.38.0': resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.50.2': resolution: {integrity: sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.38.0': resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-linux-x64-musl@4.50.2': resolution: {integrity: sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openharmony-arm64@4.50.2': resolution: {integrity: sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==} @@ -8374,24 +8352,42 @@ packages: '@shikijs/core@1.6.0': resolution: {integrity: sha512-NIEAi5U5R7BLkbW1pG/ZKu3eb1lzc3/+jD0lFsuxMT7zjaf9bbNwdNyMr7zh/Zl8EXQtQ+MYBAt5G+JLu+5DlA==} + '@shikijs/core@3.13.0': + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + '@shikijs/core@3.2.1': resolution: {integrity: sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ==} + '@shikijs/engine-javascript@3.13.0': + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + '@shikijs/engine-javascript@3.2.1': resolution: {integrity: sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q==} + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + '@shikijs/engine-oniguruma@3.2.1': resolution: {integrity: sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==} + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + '@shikijs/langs@3.2.1': resolution: {integrity: sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A==} + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + '@shikijs/themes@3.2.1': resolution: {integrity: sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ==} '@shikijs/transformers@1.6.0': resolution: {integrity: sha512-qGfHe1ECiqfE2STPWvfogIj/9Q0SK+MCRJdoITkW7AmFuB7DmbFnBT2US84+zklJOB51MzNO8RUXZiauWssJlQ==} + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + '@shikijs/types@3.2.1': resolution: {integrity: sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==} @@ -10281,10 +10277,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -10324,10 +10316,6 @@ packages: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -10423,8 +10411,8 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@1.11.0: - resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -10449,33 +10437,6 @@ packages: bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@4.1.5: - resolution: {integrity: sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.1: - resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -10635,10 +10596,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -10751,6 +10708,14 @@ packages: resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} engines: {node: '>= 6'} + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -10759,9 +10724,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -11127,6 +11089,12 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -11307,14 +11275,51 @@ packages: custom-error-instance@2.1.1: resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + d3-dispatch@3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} @@ -11323,10 +11328,23 @@ packages: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + d3-format@3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} @@ -11335,14 +11353,40 @@ packages: resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} engines: {node: '>=12'} + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + d3-scale@4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} @@ -11351,6 +11395,9 @@ packages: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} @@ -11377,10 +11424,17 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -11395,26 +11449,14 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} @@ -11441,6 +11483,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + db0@0.3.1: resolution: {integrity: sha512-3RogPLE2LLq6t4YiFCREyl572aBjkfMvfwPyN51df00TbPbryL3XqBYuJ/j6mgPssPK8AKfYdLxizaO5UG10sA==} peerDependencies: @@ -11551,10 +11596,6 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -11567,10 +11608,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -11616,6 +11653,9 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -11763,6 +11803,9 @@ packages: dompurify@3.2.4: resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -11990,10 +12033,6 @@ packages: errx@0.1.0: resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -12027,10 +12066,6 @@ packages: es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -12127,28 +12162,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] eslint-barrel-file-utils-linux-arm64-musl@0.0.10: resolution: {integrity: sha512-adEphQpPupk45Bl5ubqiEY9Fck5cKeYsbO/z7DrZQRLGezVXSS39NyriF5GO8RAqREUO/y5kcLZ9lVOv0z+fTQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] eslint-barrel-file-utils-linux-x64-gnu@0.0.10: resolution: {integrity: sha512-M9pzxzVsxSO/QJN065FB+g+VuDwqm1RxeyNybvAM8aLgB+XRdvY2GdOd6R4fFMQP6Tb86UcvFTnqtPLjoHrgTg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] eslint-barrel-file-utils-linux-x64-musl@0.0.10: resolution: {integrity: sha512-bZXxWon1P7yrPB1zCDwrwt5t41iJaisdFRPaiZGUthQy1f7iWS3Gjrrcp8ld8tjlhMZbBOCpnf1KQriwfwpY6g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] eslint-barrel-file-utils-win32-arm64-msvc@0.0.10: resolution: {integrity: sha512-waBHXxgqO8lvFpRwnO5Bn0pkNZJ0rjB4IWRmViAxnHxcPXbAq37l+ZwlxSEBsRku+Z+TnSEzcR9bOxc9kbp+Ag==} @@ -12433,10 +12464,6 @@ packages: resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} engines: {node: '>=0.10.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -12716,9 +12743,6 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -12813,9 +12837,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -12848,10 +12869,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -12922,10 +12939,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -12950,9 +12963,6 @@ packages: git-url-parse@16.1.0: resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -13013,9 +13023,9 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -13164,11 +13174,20 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true + harden-react-markdown@1.1.2: + resolution: {integrity: sha512-4VRzZUz/2oV07ugbEhQHG8elHhqqqiYHjaU4Y5Y3pf7+0kzVDJhcdAS/3SdAOKsAscT+YoPhiEMmTUnVktjDrw==} + peerDependencies: + react: '>=16.8.0' + react-markdown: '>=9.0.0' + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -13187,10 +13206,6 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - has-proto@1.2.0: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} @@ -13554,14 +13569,13 @@ packages: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -13618,10 +13632,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -13636,9 +13646,6 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} @@ -13647,10 +13654,6 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -13670,18 +13673,10 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} @@ -13714,9 +13709,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-finalizationregistry@1.1.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} @@ -13762,9 +13754,6 @@ packages: is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -13779,10 +13768,6 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -13839,10 +13824,6 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -13859,10 +13840,6 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} @@ -13882,26 +13859,14 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -13921,23 +13886,14 @@ packages: is-upper-case@2.0.2: resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.1: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - is-weakset@2.0.4: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} @@ -14233,9 +14189,16 @@ packages: resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} hasBin: true + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + hasBin: true + keyv@4.5.3: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} @@ -14259,6 +14222,13 @@ packages: knitwork@1.2.0: resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -14269,6 +14239,12 @@ packages: launch-editor@2.11.1: resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lazy-cache@2.0.2: resolution: {integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==} engines: {node: '>=0.10.0'} @@ -14496,6 +14472,11 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -14584,6 +14565,11 @@ packages: markdown-wasm@1.2.0: resolution: {integrity: sha512-S12OTkyXCkOgI1n1rZY9cg4bK/PGu80Emjpvwp8BEjwCxhPV3yddF0U6+QhCitdBsI1tzWcoeahmW7k0Pq81OA==} + marked@16.3.0: + resolution: {integrity: sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==} + engines: {node: '>= 20'} + hasBin: true + marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} @@ -14774,6 +14760,9 @@ packages: merge@2.1.1: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + mermaid@11.12.0: + resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==} + meros@1.3.0: resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} engines: {node: '>=13'} @@ -15058,10 +15047,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -15159,9 +15144,6 @@ packages: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -15311,9 +15293,6 @@ packages: nanotar@0.2.0: resolution: {integrity: sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==} - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -15419,16 +15398,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} - engines: {node: '>=10'} - node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - node-addon-api@7.1.0: resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} engines: {node: ^16 || ^18 || >= 20} @@ -15613,10 +15585,11 @@ packages: peerDependencies: next: '>=13.4 <14.0.2 || ^14.0.3' - nuqs@2.4.1: - resolution: {integrity: sha512-u6sngTspqDe3jWHtcmqHQg3dl35niizCZAsm5gy7PBlgG2rwl71Dp2QUv5hwBaWKI9qz0wqILZY86TsRxq66SQ==} + nuqs@2.7.1: + resolution: {integrity: sha512-3WDgrOZWat0QyOheyljTlXK4TGFh1JKSLvXMgusMDcTyMJXe1xL8+q3zuQ6ke1vyeGnpJwztlZl2aDkMW2eIUg==} peerDependencies: '@remix-run/react': '>=2' + '@tanstack/react-router': ^1 next: '>=14.2.0' react: '>=18.2.0 || ^19.0.0-0' react-router: ^6 || ^7 @@ -15624,6 +15597,8 @@ packages: peerDependenciesMeta: '@remix-run/react': optional: true + '@tanstack/react-router': + optional: true next: optional: true react-router: @@ -15687,10 +15662,6 @@ packages: object-to-formdata@4.5.1: resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -15757,12 +15728,18 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.5.4: resolution: {integrity: sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA==} oniguruma-to-es@4.1.0: resolution: {integrity: sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA==} + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + oo-ascii-tree@1.98.0: resolution: {integrity: sha512-+GE7ywhtS6MctbfcO+vZzqIxcFzucZCwmawcwCVo89DxQDakV1JFfFViTXG4A90UzTAsU4tQteGmwDtwOlOXLw==} engines: {node: '>= 14.17.0'} @@ -15978,6 +15955,9 @@ packages: path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -16244,6 +16224,12 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} @@ -16523,11 +16509,6 @@ packages: preact@10.26.9: resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -16761,10 +16742,6 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-accessible-treeview@2.11.2: resolution: {integrity: sha512-qui0g/gBDpP7VbtqelgJezAzAjKOY3IVi1Rq1NRJ7Z627RXKyKiQ4ooxLK2yauxTvNyU0ke9S0a2d9YUMbJJbA==} peerDependencies: @@ -17233,10 +17210,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} @@ -17259,10 +17232,6 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -17270,15 +17239,24 @@ packages: rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + rehype-harden@1.1.2: + resolution: {integrity: sha512-58RSgd3BAYW/hULy6qvrLBIRe8qe5PElwEpRjrLilvhJ3N+Y6ptKAmy1CLIIyoMz7CMI30GqENhNXksJd5hGDg==} + rehype-katex@7.0.0: resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-pretty-code@0.9.11: resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} engines: {node: '>=16'} peerDependencies: shiki: '*' + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-slug@5.1.0: resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==} @@ -17308,6 +17286,9 @@ packages: remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-html@16.0.1: resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} @@ -17479,6 +17460,9 @@ packages: engines: {node: 20 || >=22} hasBin: true + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup-plugin-visualizer@5.14.0: resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} engines: {node: '>=18'} @@ -17515,6 +17499,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -17533,6 +17520,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -17540,10 +17530,6 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -17558,10 +17544,6 @@ packages: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -17726,10 +17708,6 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - sharp@0.34.3: resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -17765,6 +17743,9 @@ packages: shiki@1.6.0: resolution: {integrity: sha512-P31ROeXcVgW/k3Z+vUUErcxoTah7ZRaimctOpzGuqAntqnnSmx1HOsvnbAB8Z2qfXPRhw61yptAzCsuKOhTHwQ==} + shiki@3.13.0: + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + shiki@3.2.1: resolution: {integrity: sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ==} @@ -17823,12 +17804,6 @@ packages: signedsource@1.0.0: resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-git@3.24.0: resolution: {integrity: sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==} @@ -18082,6 +18057,11 @@ packages: stream-slice@0.1.2: resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} + streamdown@1.3.0: + resolution: {integrity: sha512-vFZdoWKUeagzKwGGOcEqkV1fcgXOJOQqrNBor5/hbaAE/e/ULxZoIHHJJd5KEuaSddCM9KuYtIuZi3WSttXTEA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -18128,13 +18108,6 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} @@ -18192,10 +18165,6 @@ packages: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -18271,6 +18240,9 @@ packages: stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} @@ -18354,6 +18326,9 @@ packages: tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: @@ -18374,16 +18349,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} - - tar-fs@3.0.10: - resolution: {integrity: sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -18618,6 +18583,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} @@ -18702,9 +18671,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.3.3: resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] @@ -18799,34 +18765,18 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} @@ -18876,9 +18826,6 @@ packages: un-eval@1.2.0: resolution: {integrity: sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -19313,6 +19260,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@7.0.3: resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} hasBin: true @@ -19495,8 +19446,8 @@ packages: vite: optional: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -19603,9 +19554,26 @@ packages: jsdom: optional: true + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} @@ -19710,32 +19678,18 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -20046,8 +20000,15 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + '@antfu/ni@23.3.1': {} + '@antfu/utils@9.2.1': {} + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 @@ -21754,6 +21715,8 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@braintree/sanitize-url@7.1.1': {} + '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 @@ -21767,6 +21730,23 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 @@ -23112,6 +23092,21 @@ snapshots: '@humanwhocodes/object-schema@2.0.2': {} + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.2(supports-color@8.1.1)': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.1 + '@iconify/types': 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.0 @@ -23646,6 +23641,10 @@ snapshots: '@types/react': 18.3.3 react: 18.3.1 + '@mermaid-js/parser@0.6.2': + dependencies: + langium: 3.3.1 + '@mertasan/tailwindcss-variables@2.7.0(autoprefixer@10.4.21(postcss@8.5.6))(postcss@8.5.6)': dependencies: autoprefixer: 10.4.21(postcss@8.5.6) @@ -23918,11 +23917,11 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.6.3(magicast@0.3.5)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))': + '@nuxt/devtools-kit@2.6.3(magicast@0.3.5)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@nuxt/kit': 3.19.2(magicast@0.3.5) execa: 8.0.1 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - magicast @@ -23937,12 +23936,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.2 - '@nuxt/devtools@2.6.3(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + '@nuxt/devtools@2.6.3(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@nuxt/devtools-kit': 2.6.3(magicast@0.3.5)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + '@nuxt/devtools-kit': 2.6.3(magicast@0.3.5)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) '@nuxt/devtools-wizard': 2.6.3 '@nuxt/kit': 3.19.2(magicast@0.3.5) - '@vue/devtools-core': 7.7.7(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vue/devtools-core': 7.7.7(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@vue/devtools-kit': 7.7.7 birpc: 2.5.0 consola: 3.4.2 @@ -23967,9 +23966,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 1.0.0 tinyglobby: 0.2.15 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) - vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) - vite-plugin-vue-tracer: 1.0.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-plugin-vue-tracer: 1.0.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -27166,7 +27165,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1)': + '@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/generator': 7.27.0 @@ -27195,7 +27194,7 @@ snapshots: semver: 7.7.1 set-cookie-parser: 2.7.1 valibot: 0.41.0(typescript@5.9.2) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) vite-node: 3.0.0-beta.2(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) optionalDependencies: typescript: 5.9.2 @@ -27215,9 +27214,9 @@ snapshots: - tsx - yaml - '@react-router/fs-routes@7.4.0(@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2)': + '@react-router/fs-routes@7.4.0(@react-router/dev@7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2)': dependencies: - '@react-router/dev': 7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1) + '@react-router/dev': 7.4.0(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(yaml@2.8.1) minimatch: 9.0.5 optionalDependencies: typescript: 5.9.2 @@ -27883,6 +27882,13 @@ snapshots: '@shikijs/core@1.6.0': {} + '@shikijs/core@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + '@shikijs/core@3.2.1': dependencies: '@shikijs/types': 3.2.1 @@ -27890,21 +27896,40 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + '@shikijs/engine-javascript@3.2.1': dependencies: '@shikijs/types': 3.2.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.1.0 + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@3.2.1': dependencies: '@shikijs/types': 3.2.1 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/langs@3.2.1': dependencies: '@shikijs/types': 3.2.1 + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/themes@3.2.1': dependencies: '@shikijs/types': 3.2.1 @@ -27913,6 +27938,11 @@ snapshots: dependencies: shiki: 1.6.0 + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + '@shikijs/types@3.2.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -28728,7 +28758,7 @@ snapshots: babel-dead-code-elimination: 1.0.9(supports-color@8.1.1) dedent: 1.5.3(babel-plugin-macros@3.1.0) tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28849,22 +28879,22 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-config@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)': + '@tanstack/react-start-config@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)': dependencies: '@tanstack/react-start-plugin': 1.114.12(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) '@tanstack/router-core': 1.114.25 '@tanstack/router-generator': 1.114.27(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@tanstack/router-plugin': 1.114.27(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2)) + '@tanstack/router-plugin': 1.114.27(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2)) '@tanstack/server-functions-plugin': 1.114.12(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) '@tanstack/start-server-functions-handler': 1.114.25 - '@vitejs/plugin-react': 4.3.4(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) + '@vitejs/plugin-react': 4.3.4(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) import-meta-resolve: 4.1.0 nitropack: 2.11.7(@electric-sql/pglite@0.2.15)(aws4fetch@1.0.20)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(supports-color@8.1.1)(typescript@5.9.2) ofetch: 1.4.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) vinxi: 0.5.3(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(yaml@2.8.1) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -28926,7 +28956,7 @@ snapshots: '@tanstack/router-utils': 1.114.12 babel-dead-code-elimination: 1.0.9(supports-color@8.1.1) tiny-invariant: 1.3.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -29004,10 +29034,10 @@ snapshots: tiny-warning: 1.0.3 unctx: 2.4.1 - '@tanstack/react-start@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)': + '@tanstack/react-start@1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1)': dependencies: '@tanstack/react-start-client': 1.114.27(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(yaml@2.8.1) - '@tanstack/react-start-config': 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1) + '@tanstack/react-start-config': 1.114.27(@electric-sql/pglite@0.2.15)(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@22.13.14)(aws4fetch@1.0.20)(babel-plugin-macros@3.1.0)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))(yaml@2.8.1) '@tanstack/react-start-router-manifest': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(yaml@2.8.1) '@tanstack/react-start-server': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/start-api-routes': 1.114.25(@electric-sql/pglite@0.2.15)(@types/node@22.13.14)(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(ioredis@5.6.0(supports-color@8.1.1))(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.9.2)(yaml@2.8.1) @@ -29017,7 +29047,7 @@ snapshots: '@tanstack/start-server-functions-ssr': 1.114.25(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -29100,7 +29130,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-plugin@1.114.27(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))': + '@tanstack/router-plugin@1.114.27(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))(webpack@5.94.0(esbuild@0.25.2))': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10(supports-color@8.1.1)) @@ -29121,7 +29151,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) webpack: 5.94.0(esbuild@0.25.2) transitivePeerDependencies: - supports-color @@ -30122,7 +30152,7 @@ snapshots: h3: 1.15.4 http-shutdown: 1.2.2 jiti: 1.21.7 - mlly: 1.7.4 + mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.9.0 @@ -30130,14 +30160,14 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vitejs/plugin-react@4.3.4(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': + '@vitejs/plugin-react@4.3.4(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10(supports-color@8.1.1)) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10(supports-color@8.1.1)) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -30220,41 +30250,41 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(msw@2.4.11(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': + '@vitest/mocker@3.0.9(msw@2.4.11(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.4.11(typescript@5.9.2) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.13.14)(typescript@5.9.2) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.13.14)(typescript@5.9.2) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.13.14)(typescript@5.9.2) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) '@vitest/pretty-format@3.0.4': dependencies: @@ -30384,14 +30414,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.7.7(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + '@vue/devtools-core@7.7.7(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-hot-client: 2.1.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - vite @@ -30804,11 +30834,6 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -30816,12 +30841,12 @@ snapshots: array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 - is-string: 1.0.7 + is-string: 1.1.1 array-timsort@1.0.3: {} @@ -30829,34 +30854,34 @@ snapshots: array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.3: @@ -30868,23 +30893,12 @@ snapshots: array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -30973,7 +30987,7 @@ snapshots: axe-core@4.10.3: {} - axios@1.11.0: + axios@1.12.2: dependencies: follow-redirects: 1.15.9 form-data: 4.0.4 @@ -31007,28 +31021,6 @@ snapshots: bare-events@2.5.4: optional: true - bare-fs@4.1.5: - dependencies: - bare-events: 2.5.4 - bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.5.4) - optional: true - - bare-os@3.6.1: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.1 - optional: true - - bare-stream@2.6.5(bare-events@2.5.4): - dependencies: - streamx: 2.22.0 - optionalDependencies: - bare-events: 2.5.4 - optional: true - base64-js@0.0.8: {} base64-js@1.5.1: {} @@ -31260,14 +31252,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 @@ -31409,6 +31393,20 @@ snapshots: parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -31425,8 +31423,6 @@ snapshots: dependencies: readdirp: 4.1.1 - chownr@1.1.4: {} - chownr@2.0.0: {} chownr@3.0.0: {} @@ -31767,6 +31763,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -31975,12 +31979,50 @@ snapshots: custom-error-instance@2.1.1: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + d3-array@3.2.4: dependencies: internmap: 2.0.3 + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + d3-color@3.1.0: {} + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + d3-dispatch@3.0.1: {} d3-drag@3.0.0: @@ -31988,20 +32030,56 @@ snapshots: d3-dispatch: 3.0.1 d3-selection: 3.0.0 + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + d3-ease@3.0.1: {} + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + d3-format@3.1.0: {} d3-geo@3.1.0: dependencies: d3-array: 3.2.4 + d3-hierarchy@3.1.2: {} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 + d3-path@1.0.9: {} + d3-path@3.1.0: {} + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 @@ -32012,6 +32090,10 @@ snapshots: d3-selection@3.0.0: {} + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 @@ -32043,11 +32125,49 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + d@1.0.2: dependencies: es5-ext: 0.10.64 type: 2.7.3 + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + damerau-levenshtein@1.0.8: {} dat.gui@0.7.9: {} @@ -32061,36 +32181,18 @@ snapshots: whatwg-url: 11.0.0 optional: true - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 @@ -32116,6 +32218,8 @@ snapshots: dayjs@1.11.13: {} + dayjs@1.11.18: {} + db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)): optionalDependencies: '@electric-sql/pglite': 0.2.15 @@ -32179,18 +32283,12 @@ snapshots: dependencies: character-entities: 2.0.2 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - dedent@1.5.3(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 deep-eql@5.0.2: {} - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deep-rename-keys@0.2.1: @@ -32231,6 +32329,10 @@ snapshots: defu@6.1.4: {} + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} delegates@1.0.0: {} @@ -32340,6 +32442,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -32467,55 +32573,6 @@ snapshots: errx@0.1.0: {} - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.3.0 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -32615,17 +32672,11 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es5-ext@0.10.64: dependencies: @@ -32859,7 +32910,7 @@ snapshots: object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.2) @@ -32884,7 +32935,7 @@ snapshots: language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 eslint-plugin-react-hooks@5.2.0(eslint@8.57.0(supports-color@8.1.1)): @@ -33126,8 +33177,6 @@ snapshots: dependencies: fill-range: 2.2.4 - expand-template@2.0.3: {} - expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 @@ -33452,10 +33501,6 @@ snapshots: follow-redirects@1.15.9: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -33547,8 +33592,6 @@ snapshots: fresh@2.0.0: {} - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -33579,13 +33622,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -33667,12 +33703,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -33709,8 +33739,6 @@ snapshots: dependencies: git-up: 8.1.1 - github-from-package@0.0.0: {} - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -33798,9 +33826,7 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 + globals@15.15.0: {} globalthis@1.0.4: dependencies: @@ -33994,6 +34020,8 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 + hachure-fill@0.5.2: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -34003,6 +34031,12 @@ snapshots: optionalDependencies: uglify-js: 3.17.4 + harden-react-markdown@1.1.2(react-markdown@10.1.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-markdown: 10.1.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1) + rehype-harden: 1.1.2 + has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -34015,8 +34049,6 @@ snapshots: dependencies: es-define-property: 1.0.1 - has-proto@1.0.3: {} - has-proto@1.2.0: dependencies: dunder-proto: 1.0.1 @@ -34544,18 +34576,14 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + internmap@1.0.1: {} + internmap@2.0.3: {} interpret@1.4.0: {} @@ -34626,11 +34654,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.3.0 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -34645,10 +34668,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 @@ -34657,11 +34676,6 @@ snapshots: dependencies: binary-extensions: 2.2.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -34677,20 +34691,12 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-date-object@1.1.0: dependencies: call-bound: 1.0.4 @@ -34712,10 +34718,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.8 - is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 @@ -34753,8 +34755,6 @@ snapshots: dependencies: tslib: 2.8.1 - is-map@2.0.2: {} - is-map@2.0.3: {} is-module@1.0.0: {} @@ -34763,10 +34763,6 @@ snapshots: is-node-process@1.2.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -34809,11 +34805,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -34829,10 +34820,6 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 @@ -34847,29 +34834,17 @@ snapshots: is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-string@1.1.1: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.1.0 - is-symbol@1.1.1: dependencies: call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 @@ -34886,23 +34861,12 @@ snapshots: dependencies: tslib: 2.8.1 - is-weakmap@2.0.1: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakref@1.1.1: dependencies: call-bound: 1.0.4 - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - is-weakset@2.0.4: dependencies: call-bound: 1.0.4 @@ -35151,7 +35115,7 @@ snapshots: lodash: 4.17.21 minimist: 1.2.8 prettier: 3.5.3 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 json-schema-traverse@0.4.1: {} @@ -35200,17 +35164,23 @@ snapshots: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 - object.assign: 4.1.5 + object.assign: 4.1.7 object.values: 1.2.0 katex@0.16.21: dependencies: commander: 8.3.0 + katex@0.16.22: + dependencies: + commander: 8.3.0 + keyv@4.5.3: dependencies: json-buffer: 3.0.1 + khroma@2.1.0: {} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 @@ -35225,6 +35195,16 @@ snapshots: knitwork@1.2.0: {} + kolorist@1.8.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -35236,6 +35216,10 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + lazy-cache@2.0.2: dependencies: set-getter: 0.1.1 @@ -35500,6 +35484,10 @@ snapshots: dependencies: react: 18.3.1 + lucide-react@0.542.0(react@18.3.1): + dependencies: + react: 18.3.1 + lunr@2.3.9: {} luxon@3.5.0: {} @@ -35634,6 +35622,8 @@ snapshots: markdown-wasm@1.2.0: {} + marked@16.3.0: {} + marked@4.3.0: {} math-intrinsics@1.1.0: {} @@ -36064,6 +36054,31 @@ snapshots: merge@2.1.1: {} + mermaid@11.12.0(supports-color@8.1.1): + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.0.2(supports-color@8.1.1) + '@mermaid-js/parser': 0.6.2 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.18 + dompurify: 3.2.7 + katex: 0.16.22 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 16.3.0 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + meros@1.3.0(@types/node@22.13.14): optionalDependencies: '@types/node': 22.13.14 @@ -36649,8 +36664,6 @@ snapshots: mimic-fn@4.0.0: {} - mimic-response@3.1.0: {} - min-indent@1.0.1: {} mini-svg-data-uri@1.4.4: {} @@ -36748,8 +36761,6 @@ snapshots: for-in: 1.0.2 is-extendable: 1.0.1 - mkdirp-classic@0.5.3: {} - mkdirp@1.0.4: {} mkdirp@2.1.6: {} @@ -36899,8 +36910,6 @@ snapshots: nanotar@0.2.0: {} - napi-build-utils@2.0.0: {} - natural-compare@1.4.0: {} nearley@2.20.1: @@ -37238,14 +37247,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.75.0: - dependencies: - semver: 7.7.2 - node-addon-api@1.7.2: {} - node-addon-api@6.1.0: {} - node-addon-api@7.1.0: {} node-domexception@1.0.0: {} @@ -37455,19 +37458,20 @@ snapshots: mitt: 3.0.1 next: 15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4) - nuqs@2.4.1(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + nuqs@2.7.1(@tanstack/react-router@1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-router@7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - mitt: 3.0.1 + '@standard-schema/spec': 1.0.0 react: 18.3.1 optionalDependencies: + '@tanstack/react-router': 1.114.27(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: 15.5.2(@babel/core@7.28.4(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4) react-router: 7.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nuxt@4.1.2(@electric-sql/pglite@0.2.15)(@parcel/watcher@2.5.1)(@types/node@22.13.14)(@vue/compiler-sfc@3.5.21)(aws4fetch@1.0.20)(db0@0.3.2(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(eslint@8.57.0(supports-color@8.1.1))(ioredis@5.7.0(supports-color@8.1.1))(magicast@0.3.5)(rollup@4.50.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1): + nuxt@4.1.2(@electric-sql/pglite@0.2.15)(@parcel/watcher@2.5.1)(@types/node@22.13.14)(@vue/compiler-sfc@3.5.21)(aws4fetch@1.0.20)(db0@0.3.2(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3))(encoding@0.1.13)(eslint@8.57.0(supports-color@8.1.1))(ioredis@5.7.0(supports-color@8.1.1))(magicast@0.3.5)(rollup@4.50.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.3(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@nuxt/devtools': 2.6.3(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@nuxt/kit': 4.1.2(magicast@0.3.5) '@nuxt/schema': 4.1.2 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) @@ -37638,13 +37642,6 @@ snapshots: object-to-formdata@4.5.1: {} - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -37663,16 +37660,16 @@ snapshots: object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 object.pick@1.3.0: dependencies: @@ -37680,7 +37677,7 @@ snapshots: object.values@1.2.0: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -37725,6 +37722,8 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-parser@0.12.1: {} + oniguruma-parser@0.5.4: {} oniguruma-to-es@4.1.0: @@ -37734,6 +37733,12 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + oo-ascii-tree@1.98.0: {} open@10.1.0: @@ -38049,6 +38054,8 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + path-data-parser@0.1.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -38363,6 +38370,13 @@ snapshots: pluralize@8.0.0: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + polished@4.2.2: dependencies: '@babel/runtime': 7.26.10 @@ -38616,21 +38630,6 @@ snapshots: preact@10.26.9: {} - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.75.0 - pump: 3.0.3 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.3 - tunnel-agent: 0.6.0 - prelude-ls@1.2.1: {} prettier-plugin-sql-cst@0.11.1: @@ -38844,13 +38843,6 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-accessible-treeview@2.11.2(classnames@2.5.1)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: classnames: 2.5.1 @@ -39464,16 +39456,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - refractor@3.6.0: dependencies: hastscript: 6.0.0 @@ -39496,13 +39478,6 @@ snapshots: regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -39521,6 +39496,8 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 + rehype-harden@1.1.2: {} + rehype-katex@7.0.0: dependencies: '@types/hast': 3.0.4 @@ -39531,6 +39508,16 @@ snapshots: unist-util-visit-parents: 6.0.1 vfile: 6.0.3 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.0 + katex: 0.16.22 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + rehype-pretty-code@0.9.11(shiki@1.6.0): dependencies: '@types/hast': 2.3.6 @@ -39538,6 +39525,12 @@ snapshots: parse-numeric-range: 1.3.0 shiki: 1.6.0 + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.0.1 + vfile: 6.0.3 + rehype-slug@5.1.0: dependencies: '@types/hast': 2.3.6 @@ -39611,6 +39604,17 @@ snapshots: transitivePeerDependencies: - supports-color + remark-gfm@4.0.1(supports-color@8.1.1): + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0(supports-color@8.1.1) + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-html@16.0.1: dependencies: '@types/mdast': 4.0.4 @@ -39827,6 +39831,8 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.1 + robust-predicates@3.0.2: {} + rollup-plugin-visualizer@5.14.0(rollup@4.50.2): dependencies: open: 8.4.2 @@ -39898,6 +39904,13 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.50.2 fsevents: 2.3.3 + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -39920,6 +39933,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + rxjs@7.8.1: dependencies: tslib: 2.8.1 @@ -39928,13 +39943,6 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -39952,12 +39960,6 @@ snapshots: es-errors: 1.3.0 isarray: 2.0.5 - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -40197,19 +40199,6 @@ snapshots: shallowequal@1.1.0: {} - sharp@0.32.6: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.3 - semver: 7.7.1 - simple-get: 4.0.1 - tar-fs: 3.0.10 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-buffer - sharp@0.34.3: dependencies: color: 4.2.3 @@ -40238,7 +40227,6 @@ snapshots: '@img/sharp-win32-arm64': 0.34.3 '@img/sharp-win32-ia32': 0.34.3 '@img/sharp-win32-x64': 0.34.3 - optional: true shebang-command@1.2.0: dependencies: @@ -40267,6 +40255,17 @@ snapshots: dependencies: '@shikijs/core': 1.6.0 + shiki@3.13.0: + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/engine-javascript': 3.13.0 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + shiki@3.2.1: dependencies: '@shikijs/core': 3.2.1 @@ -40347,14 +40346,6 @@ snapshots: signedsource@1.0.0: {} - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - simple-git@3.24.0(supports-color@8.1.1): dependencies: '@kwsites/file-exists': 1.1.1(supports-color@8.1.1) @@ -40621,6 +40612,26 @@ snapshots: stream-slice@0.1.2: {} + streamdown@1.3.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1): + dependencies: + clsx: 2.1.1 + harden-react-markdown: 1.1.2(react-markdown@10.1.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1))(react@18.3.1) + katex: 0.16.22 + lucide-react: 0.542.0(react@18.3.1) + marked: 16.3.0 + mermaid: 11.12.0(supports-color@8.1.1) + react: 18.3.1 + react-markdown: 10.1.0(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1) + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1(supports-color@8.1.1) + remark-math: 6.0.0(supports-color@8.1.1) + shiki: 3.13.0 + tailwind-merge: 3.3.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + streamsearch@1.1.0: {} streamx@2.22.0: @@ -40652,9 +40663,9 @@ snapshots: string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: @@ -40674,14 +40685,14 @@ snapshots: string.prototype.padend@3.1.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -40693,19 +40704,6 @@ snapshots: es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.1.1 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -40715,7 +40713,7 @@ snapshots: string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -40764,8 +40762,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} strip-literal@3.0.0: @@ -40857,6 +40853,8 @@ snapshots: stylis@4.3.1: {} + stylis@4.3.6: {} + sucrase@3.34.0: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -40960,6 +40958,8 @@ snapshots: tailwind-merge@1.14.0: {} + tailwind-merge@3.3.1: {} + tailwindcss-animate@1.0.7(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@22.13.14)(typescript@5.9.2))): dependencies: tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@22.13.14)(typescript@5.9.2)) @@ -40997,31 +40997,6 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.3: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - - tar-fs@3.0.10: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.1.5 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-buffer - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - tar-stream@3.1.7: dependencies: b4a: 1.6.7 @@ -41249,6 +41224,8 @@ snapshots: dependencies: typescript: 5.9.2 + ts-dedent@2.2.0: {} + ts-easing@0.2.0: {} ts-essentials@10.0.3(typescript@5.9.2): @@ -41336,10 +41313,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - turbo-darwin-64@2.3.3: optional: true @@ -41422,70 +41395,38 @@ snapshots: type@2.7.3: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.6 + reflect.getprototypeof: 1.0.10 typed.js@2.0.16: {} @@ -41514,13 +41455,6 @@ snapshots: un-eval@1.2.0: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -41609,9 +41543,9 @@ snapshots: acorn: 8.14.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - local-pkg: 1.1.1 + local-pkg: 1.1.2 magic-string: 0.30.19 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 picomatch: 4.0.3 pkg-types: 1.3.1 @@ -41873,7 +41807,7 @@ snapshots: dependencies: knitwork: 1.2.0 magic-string: 0.30.19 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 1.1.2 pkg-types: 1.3.1 unplugin: 1.16.1 @@ -41967,6 +41901,8 @@ snapshots: uuid@10.0.0: {} + uuid@11.1.0: {} + uuid@7.0.3: {} uuid@8.3.2: {} @@ -42120,7 +42056,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.15.0(aws4fetch@1.0.20)(db0@0.3.1(@electric-sql/pglite@0.2.15)(drizzle-orm@0.44.2(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.4)(pg@8.16.3)))(ioredis@5.6.0(supports-color@8.1.1)) - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -42165,15 +42101,15 @@ snapshots: - xml2js - yaml - vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-dev-rpc@1.1.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) - vite-hot-client: 2.1.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) - vite-hot-client@2.1.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-hot-client@2.1.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vite-node@3.0.0-beta.2(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1): dependencies: @@ -42181,7 +42117,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -42202,7 +42138,7 @@ snapshots: debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) transitivePeerDependencies: - '@types/node' - jiti @@ -42223,7 +42159,7 @@ snapshots: debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -42244,7 +42180,7 @@ snapshots: debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -42296,7 +42232,7 @@ snapshots: eslint: 8.57.0(supports-color@8.1.1) typescript: 5.9.2 - vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(supports-color@8.1.1)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: ansis: 4.1.0 debug: 4.4.3(supports-color@8.1.1) @@ -42306,46 +42242,46 @@ snapshots: perfect-debounce: 2.0.0 sirv: 3.0.2 unplugin-utils: 0.3.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) - vite-dev-rpc: 1.1.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) optionalDependencies: '@nuxt/kit': 3.19.2(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-vue-tracer@1.0.0(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): + vite-plugin-vue-tracer@1.0.0(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.7 magic-string: 0.30.19 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.21(typescript@5.9.2) - vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)): + vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)): dependencies: debug: 4.3.7(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.9.2) optionalDependencies: - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)): + vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.9.2)(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)): dependencies: debug: 4.3.7(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.9.2) optionalDependencies: - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): + vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): dependencies: esbuild: 0.25.2 fdir: 6.5.0(picomatch@4.0.3) @@ -42362,7 +42298,7 @@ snapshots: tsx: 4.19.3 yaml: 2.4.5 - vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1): + vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1): dependencies: esbuild: 0.25.2 fdir: 6.5.0(picomatch@4.0.3) @@ -42379,7 +42315,7 @@ snapshots: tsx: 4.19.3 yaml: 2.8.1 - vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1): + vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: esbuild: 0.25.2 fdir: 6.5.0(picomatch@4.0.3) @@ -42416,7 +42352,7 @@ snapshots: vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.4.11(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/mocker': 3.0.9(msw@2.4.11(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -42432,7 +42368,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -42456,7 +42392,7 @@ snapshots: vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -42472,7 +42408,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -42496,7 +42432,7 @@ snapshots: vitest@3.0.9(@types/node@22.13.14)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -42512,7 +42448,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) why-is-node-running: 2.3.0 optionalDependencies: @@ -42535,7 +42471,7 @@ snapshots: vitest@3.0.9(@types/node@22.13.14)(jiti@2.5.1)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.9.2))(vite@6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -42551,7 +42487,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) + vite: 6.3.6(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -42571,8 +42507,23 @@ snapshots: - tsx - yaml + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + vscode-languageserver-types@3.17.5: {} + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + vscode-uri@3.1.0: {} vue-bundle-renderer@2.1.2: @@ -42736,14 +42687,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -42752,21 +42695,6 @@ snapshots: is-string: 1.1.1 is-symbol: 1.1.1 - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.19 - which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 @@ -42783,13 +42711,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.19 - which-collection@1.0.1: - dependencies: - is-map: 2.0.2 - is-set: 2.0.3 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - which-collection@1.0.2: dependencies: is-map: 2.0.3 @@ -42797,14 +42718,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d9b3efb8e0b..cd7e5e0a502 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,31 +1,58 @@ packages: - - 'apps/*' - - 'packages/*' - - 'blocks/*' - - 'e2e/*' + - apps/* + - packages/* + - blocks/* + - e2e/* catalog: '@types/node': ^22.0.0 '@types/react': '^18.3.0' '@types/react-dom': '^18.3.0' - '@supabase/auth-js': 2.73.0-rc.5 + '@supabase/auth-js': 2.72.0-rc.11 '@supabase/supabase-js': ^2.47.14 '@supabase/realtime-js': ^2.11.3 - 'next': ^15.5.2 - 'react': '^18.3.0' - 'react-dom': '^18.3.0' - 'tailwindcss': '3.4.1' - 'typescript': '~5.9.0' - 'valtio': '^1.12.0' - 'vite': '^6.2.7' - 'zod': '^3.25.76' + '@supabase/supabase-js': ^2.47.14 + '@types/node': ^22.0.0 + '@types/react': ^18.3.0 + '@types/react-dom': ^18.3.0 + next: ^15.5.2 + react: ^18.3.0 + react-dom: ^18.3.0 + tailwindcss: 3.4.1 + typescript: ~5.9.0 + valtio: ^1.12.0 + vite: ^6.3.6 + zod: ^3.25.76 + +ignoredBuiltDependencies: + - '@parcel/watcher' + - '@sentry/cli' + - contentlayer2 + - core-js + - es5-ext + - esbuild + - libpg-query + - msw + - node-pty + - protobufjs + - sharp minimumReleaseAge: 10080 + minimumReleaseAgeExclude: - - 'ai' + - ai - '@ai-sdk/*' - '@supabase/mcp-server-supabase' - '@supabase/mcp-utils' - - '@supabase/auth-js' - - '@supabase/supabase-js' - - '@supabase/realtime-js' + - '@supabase/*' + +onlyBuiltDependencies: + - supabase + +overrides: + '@redocly/respect-core>form-data': ^4.0.4 + '@supabase/supabase-js>@supabase/auth-js': 'catalog:' + '@tanstack/directive-functions-plugin>vite': 'catalog:' + '@tanstack/react-start-plugin>vite': 'catalog:' + esbuild: ^0.25.2 + tmp: ^0.2.4 diff --git a/scripts/generateLocalEnv.js b/scripts/generateLocalEnv.js index ac7a488c72d..d4134e5d539 100644 --- a/scripts/generateLocalEnv.js +++ b/scripts/generateLocalEnv.js @@ -8,11 +8,15 @@ const generatedEnv = require('../keys.json') */ const defaultEnv = { - // POSTGRES_PASSWORD: 'postgres', // NEXT_ANALYTICS_BACKEND_PROVIDER: 'postgres', // SUPABASE_REST_URL: 'http://127.0.0.1:54321/rest/v1/', // NEXT_PUBLIC_ENABLE_LOGS: 'false', // NEXT_PUBLIC_IS_PLATFORM: 'false', + PG_META_CRYPTO_KEY: 'SAMPLE_KEY', + POSTGRES_PASSWORD: 'postgres', + POSTGRES_HOST: 'db', + POSTGRES_DB: 'postgres', + POSTGRES_PORT: '5432', SUPABASE_ANON_KEY: '$ANON_KEY', SUPABASE_SERVICE_KEY: '$SERVICE_ROLE_KEY', SUPABASE_URL: '$API_URL', diff --git a/supa-mdx-lint/Rule003Spelling.toml b/supa-mdx-lint/Rule003Spelling.toml index 91a877b738e..76d95a92010 100644 --- a/supa-mdx-lint/Rule003Spelling.toml +++ b/supa-mdx-lint/Rule003Spelling.toml @@ -246,6 +246,7 @@ allow_list = [ "PostQUEL", "PostgREST", "Postgres", + "postgres-meta", # We prefer Postgres, but check for vocabulary preference in a separate rule "PostgreSQL", "ProGuard", diff --git a/turbo.json b/turbo.json index a7c33bf5533..7dd90e5bbb2 100644 --- a/turbo.json +++ b/turbo.json @@ -82,6 +82,11 @@ // These envs are technically passthrough env vars because they're only used on the server side of Nextjs "PLATFORM_PG_META_URL", "STUDIO_PG_META_URL", + "PG_META_CRYPTO_KEY", + "POSTGRES_PASSWORD", + "POSTGRES_HOST", + "POSTGRES_DB", + "POSTGRES_PORT", "READ_ONLY_URL", "READ_ONLY_API_KEY", "SUPABASE_SERVICE_KEY",