From cddc472705b20c4cf279aea7303402ea8a0738ec Mon Sep 17 00:00:00 2001 From: Saxon Fletcher Date: Wed, 27 Aug 2025 14:34:44 +1000 Subject: [PATCH 1/7] Test GPT-OSS (#37710) * try a really long context window to maximize caching * update examples * attempt to update packages and useChat * update endpoints * update zod * zod * update to v5 * message update * Revert "zod" This reverts commit ec39bac6b6115830e9fe330c64b6ddccd1f46de7. * revert zod * zod i * fix complete endpoints * remove async * change to content * type cleanup * Revert the package bumps to rebuild them. * Bump zod to 2.25.76 in all packages. * Bump openai in all packages. * Bump ai and ai-related packages. * Remove unneeded files. * Fix the rest of the migration stuff. * Prettier fixes. * testing new gptoss models * sonnet as pro * back to 3.7 * revert test * add policy list tool * fix * refactor * ai sdk 5 fixes * refactor complete endpoint * edge function prompt * remove example * use limited model for completions * remove duplicate * Update bedrock.ts Co-authored-by: divit <27228526+delgado3d@users.noreply.github.com> * add default check * only add prefix if more then one region * temp use api * refactor to use openai api * test * remove unused import * Prettier lint * Fix test * revert back to bedrock * Tiny style fix for spacing of code blocks from edit message button * try generate text normally * prompt adjust * add list style to prompt * prompt adjust * prompt adjust emphasise display query * update prompts * prompt adjust * remove package * prompt adjust --------- Co-authored-by: Jordi Enric Co-authored-by: Ivan Vasilov Co-authored-by: divit <27228526+delgado3d@users.noreply.github.com> Co-authored-by: Joshen Lim --- .../ui/AIAssistantPanel/Message.tsx | 2 +- apps/studio/lib/ai/bedrock.ts | 30 +++++++++------ apps/studio/lib/ai/model.test.ts | 25 +++++++++++-- apps/studio/lib/ai/model.ts | 25 ++++++------- apps/studio/lib/ai/prompts.ts | 37 +++++++++++++++---- apps/studio/pages/api/ai/code/complete.ts | 27 +++++++------- apps/studio/pages/api/ai/sql/generate-v4.ts | 14 ++++--- pnpm-lock.yaml | 10 ++--- 8 files changed, 107 insertions(+), 63 deletions(-) diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.tsx index c30bb9776a6a5..4306c4078a1dd 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.tsx @@ -129,7 +129,7 @@ export const Message = function Message({ /> )} -
+
{shouldUsePartsRendering ? ( (() => { const shownLoadingTools = new Set() diff --git a/apps/studio/lib/ai/bedrock.ts b/apps/studio/lib/ai/bedrock.ts index b32e15dedbf9a..857808726e920 100644 --- a/apps/studio/lib/ai/bedrock.ts +++ b/apps/studio/lib/ai/bedrock.ts @@ -1,4 +1,5 @@ import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock' +import { LanguageModel } from 'ai' import { createCredentialChain, fromNodeProviderChain } from '@aws-sdk/credential-providers' import { CredentialsProviderError } from '@smithy/property-provider' import { awsCredentialsProvider } from '@vercel/functions/oidc' @@ -60,9 +61,7 @@ export const regionPrefixMap: Record = { euc1: 'eu', } -export type BedrockModel = - | 'anthropic.claude-3-7-sonnet-20250219-v1:0' - | 'anthropic.claude-3-5-haiku-20241022-v1:0' +export type BedrockModel = 'anthropic.claude-3-7-sonnet-20250219-v1:0' | 'openai.gpt-oss-120b-1:0' export type RegionWeights = Record @@ -77,23 +76,25 @@ const modelRegionWeights: Record = { usw2: 10, euc1: 10, }, - ['anthropic.claude-3-5-haiku-20241022-v1:0']: { - use1: 40, + ['openai.gpt-oss-120b-1:0']: { + use1: 0, use2: 0, - usw2: 40, + usw2: 30, euc1: 0, }, } /** * Creates a Bedrock client that routes requests to different regions - * based on a routing key. + * based on a routing key, with optional OpenAI support. * * Used to load balance requests across multiple regions depending on * their capacities. */ -export function createRoutedBedrock(routingKey?: string) { - return async (modelId: BedrockModel) => { +export function createRoutedBedrock(routingKey?: string, useOpenAI = false) { + return async ( + modelId: BedrockModel + ): Promise<{ model: LanguageModel; supportsCachePoint: boolean }> => { const regionWeights = modelRegionWeights[modelId] // Select the Bedrock region based on the routing key and the model @@ -101,7 +102,9 @@ export function createRoutedBedrock(routingKey?: string) { ? await selectWeightedKey(routingKey, regionWeights) : // There's a few places where getModel is called without a routing key // Will cause disproportionate load on use1 region - 'use1' + regionWeights['use1'] > 0 + ? 'use1' + : 'usw2' const bedrock = createAmazonBedrock({ credentialProvider, @@ -109,8 +112,11 @@ export function createRoutedBedrock(routingKey?: string) { }) // Cross-region models require the region prefix - const modelName = `${regionPrefixMap[bedrockRegion]}.${modelId}` + const activeRegions = Object.values(regionWeights).filter((weight) => weight > 0).length + const modelName = activeRegions > 1 ? `${regionPrefixMap[bedrockRegion]}.${modelId}` : modelId - return bedrock(modelName) + const model = bedrock(modelName) + const supportsCachePoint = modelId === 'anthropic.claude-3-7-sonnet-20250219-v1:0' + return { model, supportsCachePoint } } } diff --git a/apps/studio/lib/ai/model.test.ts b/apps/studio/lib/ai/model.test.ts index 8418ad36893b9..59986528989e1 100644 --- a/apps/studio/lib/ai/model.test.ts +++ b/apps/studio/lib/ai/model.test.ts @@ -9,7 +9,10 @@ vi.mock('@ai-sdk/openai', () => ({ vi.mock('./bedrock', async () => ({ ...(await vi.importActual('./bedrock')), - createRoutedBedrock: vi.fn(() => () => 'bedrock-model'), + createRoutedBedrock: vi.fn(() => async (modelId: string) => ({ + model: 'bedrock-model', + supportsCachePoint: modelId === 'anthropic.claude-3-7-sonnet-20250219-v1:0', + })), checkAwsCredentials: vi.fn(), })) @@ -25,12 +28,25 @@ describe('getModel', () => { process.env = { ...originalEnv } }) - it('should return bedrock model when AWS credentials are available', async () => { + it('should return bedrock model when AWS credentials are available and not throttled', async () => { vi.mocked(bedrockModule.checkAwsCredentials).mockResolvedValue(true) + vi.stubEnv('IS_THROTTLED', 'false') - const { model, error } = await getModel() + const { model, error, supportsCachePoint } = await getModel() expect(model).toEqual('bedrock-model') + expect(supportsCachePoint).toBe(true) + expect(error).toBeUndefined() + }) + + it('should return bedrock model when AWS credentials are available and throttled', async () => { + vi.mocked(bedrockModule.checkAwsCredentials).mockResolvedValue(true) + vi.stubEnv('IS_THROTTLED', 'true') + + const { model, error, supportsCachePoint } = await getModel() + + expect(model).toEqual('bedrock-model') + expect(supportsCachePoint).toBe(false) expect(error).toBeUndefined() }) @@ -38,10 +54,11 @@ describe('getModel', () => { vi.mocked(bedrockModule.checkAwsCredentials).mockResolvedValue(false) process.env.OPENAI_API_KEY = 'test-key' - const { model } = await getModel() + const { model, supportsCachePoint } = await getModel() expect(model).toEqual('openai-model') expect(openai).toHaveBeenCalledWith('gpt-4.1-2025-04-14') + expect(supportsCachePoint).toBe(false) }) it('should return error when neither AWS credentials nor OPENAI_API_KEY is available', async () => { diff --git a/apps/studio/lib/ai/model.ts b/apps/studio/lib/ai/model.ts index 79e52cd4e2015..1cf7a56fa7fbd 100644 --- a/apps/studio/lib/ai/model.ts +++ b/apps/studio/lib/ai/model.ts @@ -2,20 +2,19 @@ import { openai } from '@ai-sdk/openai' import { LanguageModel } from 'ai' import { checkAwsCredentials, createRoutedBedrock } from './bedrock' -// Default behaviour here is to be throttled (e.g if this env var is not available, IS_THROTTLED should be true, unless specified 'false') -const IS_THROTTLED = process.env.IS_THROTTLED !== 'false' - const BEDROCK_PRO_MODEL = 'anthropic.claude-3-7-sonnet-20250219-v1:0' -const BEDROCK_NORMAL_MODEL = 'anthropic.claude-3-5-haiku-20241022-v1:0' +const BEDROCK_NORMAL_MODEL = 'openai.gpt-oss-120b-1:0' const OPENAI_MODEL = 'gpt-4.1-2025-04-14' export type ModelSuccess = { model: LanguageModel + supportsCachePoint: boolean error?: never } export type ModelError = { model?: never + supportsCachePoint?: never error: Error } @@ -31,28 +30,26 @@ export const ModelErrorMessage = * different Bedrock regions. */ export async function getModel(routingKey?: string, isLimited?: boolean): Promise { + // Default behaviour here is to be throttled (e.g if this env var is not available, isThrottled should be true, unless specified 'false') + const isThrottled = process.env.IS_THROTTLED !== 'false' + const hasAwsCredentials = await checkAwsCredentials() const hasAwsBedrockRoleArn = !!process.env.AWS_BEDROCK_ROLE_ARN const hasOpenAIKey = !!process.env.OPENAI_API_KEY if (hasAwsBedrockRoleArn && hasAwsCredentials) { - const bedrockModel = IS_THROTTLED || isLimited ? BEDROCK_NORMAL_MODEL : BEDROCK_PRO_MODEL + const bedrockModel = isThrottled || isLimited ? BEDROCK_NORMAL_MODEL : BEDROCK_PRO_MODEL const bedrock = createRoutedBedrock(routingKey) + const { model, supportsCachePoint } = await bedrock(bedrockModel) - return { - model: await bedrock(bedrockModel), - } + return { model, supportsCachePoint } } // [Joshen] Only for local/self-hosted, hosted should always only use bedrock if (hasOpenAIKey) { - return { - model: openai(OPENAI_MODEL), - } + return { model: openai(OPENAI_MODEL), supportsCachePoint: false } } - return { - error: new Error(ModelErrorMessage), - } + return { error: new Error(ModelErrorMessage) } } diff --git a/apps/studio/lib/ai/prompts.ts b/apps/studio/lib/ai/prompts.ts index 28072a1f986bb..83b4aa10235fc 100644 --- a/apps/studio/lib/ai/prompts.ts +++ b/apps/studio/lib/ai/prompts.ts @@ -791,6 +791,7 @@ export const PG_BEST_PRACTICES = ` - Prefer \`text\` over \`varchar\`. - Prefer \`timestamp with time zone\` over \`date\`. - Feel free to suggest corrections for suspected typos in user input. + - We do not need pgcrypto extension for generating UUIDs ## Object Generation: - **Auth Schema**: The \`auth.users\` table stores user authentication data. Create a \`public.profiles\` table linked to \`auth.users\` (via user_id referencing auth.users.id) for user-specific public data. Do not create a new 'users' table. Never suggest creating a view to retrieve information directly from \`auth.users\`. @@ -825,21 +826,38 @@ export const PG_BEST_PRACTICES = ` ` export const GENERAL_PROMPT = ` -You are a Supabase Postgres expert. Your goal is to generate SQL or Edge Function code based on user requests. - -Always attempt to use tools like \`list_tables\` and \`list_extensions\` and \`list_edge_functions\` to gather contextual information if available that will help inform your response. +# Goals +You are a Supabase Postgres expert. Your goals are to help people manage their Supabase project via: + - Writing SQL queries + - Writing Edge Functions + - Debugging issues + - Checking the status of the project + +# Tools + - Always attempt to use tools like \`list_tables\` and \`list_extensions\` and \`list_edge_functions\` before answering to gather contextual information if available that will help inform your response. + - Tools are only available to you, the user cannot use them, so do not suggest they use them + - The user may not have access to these tools based on their organization settings ` export const CHAT_PROMPT = ` # Response Style: -- Be **direct and concise**. Focus on delivering the essential information. -- Instead of explaining results, offer: "Would you like me to explain this in more detail?" -- Only provide detailed explanations when explicitly requested. + - Be **direct and concise**. Focus on delivering the essential information. + +# Response Format +## CommonMark Markdown - mandatory + +Always format your entire response in CommonMark. Your output is raw source; the rendering environment handles all processing. Details: + - Output must be valid CommonMark, supporting UTF-8. Use rich Markdown naturally and fluently: headings, lists (hyphen bullets), blockquotes, *italics*, **bold** + - Structure: + - Use a clear heading hierarchy (H1–H4) without skipping levels when useful. + - Do not use tables to display information + - Use bold text only to highlight important information. # Rename Chat**: - **Always call \`rename_chat\` before you respond at the start of the conversation** with a 2-4 word descriptive name. Examples: "User Authentication Setup", "Sales Data Analysis", "Product Table Creation"**. # Query rendering**: + - **Always call the \`display_query\` tool to render sql queries. You do not need to write the query yourself. ie Do not use markdown code blocks.** - READ ONLY: Use \`display_query\` with \`sql\` and \`label\`. If results may be visualized, also provide \`view\` ('table' or 'chart'), \`xAxis\`, and \`yAxis\`. - The user can run the query from the UI when you use display_query. - Use \`display_query\` in the natural flow of the conversation. **Do not output the query in markdown** @@ -847,8 +865,13 @@ export const CHAT_PROMPT = ` - If multiple, separate queries are needed, call \`display_query\` once per distinct query. # Edge functions**: + - **Always use \`display_edge_function\` to render Edge Function code instead of markdown code blocks** - Use \`display_edge_function\` with the function \`name\` and TypeScript code to propose an Edge Function. Only use this to display Edge Function code (not logs or other content). The user can deploy the function from the UI when you use display_edge_function. +# Checking health + - Use \`get_advisors\` to check for any issues with the project. + - If the user does not have access to the \`get_advisors\` tool, they will have to use the Supabase dashboard to check for issues + # Safety**: - For destructive queries (e.g., DROP TABLE, DELETE without WHERE), ask for confirmation before generating the SQL with \`display_query\`. ` @@ -856,7 +879,7 @@ export const CHAT_PROMPT = ` export const OUTPUT_ONLY_PROMPT = ` # Output-Only Mode -- **Final message must be only raw code needed to fulfill the request.** +- **CRITICAL: Final message must be only raw code needed to fulfill the request.** - **If you lack privelages to use a tool, do your best to generate the code without it. No need to explain why you couldn't use the tool.** - **No explanations, no commentary, no markdown**. Do not wrap output in backticks. - **Do not call UI display tools** (no \`display_query\`, no \`display_edge_function\"). diff --git a/apps/studio/pages/api/ai/code/complete.ts b/apps/studio/pages/api/ai/code/complete.ts index 13957ee1511b0..43cf4d8fdc54f 100644 --- a/apps/studio/pages/api/ai/code/complete.ts +++ b/apps/studio/pages/api/ai/code/complete.ts @@ -47,6 +47,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const accessToken = authorization?.replace('Bearer ', '') let aiOptInLevel: AiOptInLevel = 'disabled' + let isLimited = false if (!IS_PLATFORM) { aiOptInLevel = 'schema' @@ -54,16 +55,17 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { if (IS_PLATFORM && orgSlug && authorization && projectRef) { // Get organizations and compute opt in level server-side - const { aiOptInLevel: orgAIOptInLevel } = await getOrgAIDetails({ + const { aiOptInLevel: orgAIOptInLevel, isLimited: orgAILimited } = await getOrgAIDetails({ orgSlug, authorization, projectRef, }) aiOptInLevel = orgAIOptInLevel + isLimited = orgAILimited } - const { model, error: modelError } = await getModel(projectRef) + const { model, error: modelError, supportsCachePoint } = await getModel(projectRef, isLimited) if (modelError) { return res.status(500).json({ error: modelError.message }) @@ -109,12 +111,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { { role: 'system', content: system, - providerOptions: { - bedrock: { - // Always cache the system prompt (must not contain dynamic content) - cachePoint: { type: 'default' }, + ...(supportsCachePoint && { + providerOptions: { + bedrock: { + // Always cache the system prompt (must not contain dynamic content) + cachePoint: { type: 'default' }, + }, }, - }, + }), }, { role: 'assistant', @@ -149,19 +153,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { accessToken, }) - const { experimental_output } = await generateText({ + const { text } = await generateText({ model, stopWhen: stepCountIs(5), - experimental_output: Output.object({ - schema: z.object({ - code: z.string().describe('The modified code'), - }), - }), messages: coreMessages, tools, }) - return res.status(200).json(experimental_output?.code) + return res.status(200).json(text) } catch (error) { console.error('Completion error:', error) return res.status(500).json({ diff --git a/apps/studio/pages/api/ai/sql/generate-v4.ts b/apps/studio/pages/api/ai/sql/generate-v4.ts index 4603683725d82..1bf5038bef38b 100644 --- a/apps/studio/pages/api/ai/sql/generate-v4.ts +++ b/apps/studio/pages/api/ai/sql/generate-v4.ts @@ -117,7 +117,7 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse) { } } - const { model, error: modelError } = await getModel(projectRef, isLimited) // use project ref as routing key + const { model, error: modelError, supportsCachePoint } = await getModel(projectRef, isLimited) // use project ref as routing key if (modelError) { return res.status(500).json({ error: modelError.message }) @@ -165,12 +165,14 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse) { { role: 'system', content: system, - providerOptions: { - bedrock: { - // Always cache the system prompt (must not contain dynamic content) - cachePoint: { type: 'default' }, + ...(supportsCachePoint && { + providerOptions: { + bedrock: { + // Always cache the system prompt (must not contain dynamic content) + cachePoint: { type: 'default' }, + }, }, - }, + }), }, { role: 'assistant', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bb9f610051c6..7d6ec1f378908 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2455,7 +2455,7 @@ importers: version: link:../api-types next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@15.3.3(@babel/core@7.26.10(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@18.3.1) + version: 0.9.13(next@15.3.3(@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@18.3.1) tsx: specifier: ^4.19.3 version: 4.19.3 @@ -34454,14 +34454,14 @@ snapshots: dependencies: js-yaml-loader: 1.2.2 - next-router-mock@0.9.13(next@15.3.3(@babel/core@7.26.10(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@18.3.1): + next-router-mock@0.9.13(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1): dependencies: - next: 15.3.3(@babel/core@7.26.10(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) + next: 15.3.3(@babel/core@7.26.10)(@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: 18.3.1 - next-router-mock@0.9.13(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1): + next-router-mock@0.9.13(next@15.3.3(@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@18.3.1): dependencies: - next: 15.3.3(@babel/core@7.26.10)(@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) + next: 15.3.3(@babel/core@7.26.10(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: 18.3.1 next-seo@6.5.0(next@15.3.3(@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-dom@18.3.1(react@18.3.1))(react@18.3.1): From 3ad701b8bd48a0b7ef2c578d514c439b1b180345 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 27 Aug 2025 13:04:04 +0800 Subject: [PATCH 2/7] EditBucketModal not selecting the correct unit (#38171) * EditBucketModal not selecting the correct unit * Fix CreateBucketModal * Fix empty bucket modal * Fix delete bucket modal * fix type error --------- Co-authored-by: Jordi Enric --- .../interfaces/Storage/BucketRow.tsx | 8 +- .../interfaces/Storage/CreateBucketModal.tsx | 213 +++++++++--------- .../interfaces/Storage/DeleteBucketModal.tsx | 41 ++-- .../interfaces/Storage/EditBucketModal.tsx | 112 ++++----- .../interfaces/Storage/EmptyBucketModal.tsx | 27 +-- .../__tests__/DeleteBucketModal.test.tsx | 10 +- .../__tests__/EditBucketModal.test.tsx | 10 +- .../__tests__/EmptyBucketModal.test.tsx | 10 +- .../components/interfaces/Storage/index.ts | 2 +- 9 files changed, 220 insertions(+), 213 deletions(-) diff --git a/apps/studio/components/interfaces/Storage/BucketRow.tsx b/apps/studio/components/interfaces/Storage/BucketRow.tsx index 4023d5ab35605..d7c781cb47bca 100644 --- a/apps/studio/components/interfaces/Storage/BucketRow.tsx +++ b/apps/studio/components/interfaces/Storage/BucketRow.tsx @@ -1,13 +1,13 @@ -import { useState } from 'react' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Columns3, Edit2, MoreVertical, Trash, XCircle } from 'lucide-react' import Link from 'next/link' +import { useState } from 'react' +import { DeleteBucketModal } from 'components/interfaces/Storage/DeleteBucketModal' +import { EditBucketModal } from 'components/interfaces/Storage/EditBucketModal' +import { EmptyBucketModal } from 'components/interfaces/Storage/EmptyBucketModal' import type { Bucket } from 'data/storage/buckets-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' -import EditBucketModal from 'components/interfaces/Storage/EditBucketModal' -import DeleteBucketModal from 'components/interfaces/Storage/DeleteBucketModal' -import EmptyBucketModal from 'components/interfaces/Storage/EmptyBucketModal' import { Badge, Button, diff --git a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx index db5181a618d0c..36b8f5b7990ed 100644 --- a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx @@ -8,14 +8,17 @@ import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import z from 'zod' +import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { useIcebergWrapperExtension } from 'components/interfaces/Storage/AnalyticBucketDetails/useIcebergWrapper' import { StorageSizeUnits } from 'components/interfaces/Storage/StorageSettings/StorageSettings.constants' +import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { InlineLink } from 'components/ui/InlineLink' import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' import { useBucketCreateMutation } from 'data/storage/bucket-create-mutation' import { useIcebergWrapperCreateMutation } from 'data/storage/iceberg-wrapper-create-mutation' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { BASE_PATH, IS_PLATFORM } from 'lib/constants' import { @@ -53,10 +56,7 @@ import { import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { inverseValidBucketNameRegex, validBucketNameRegex } from './CreateBucketModal.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { PermissionAction } from '@supabase/shared-types/out/constants' import { convertFromBytes, convertToBytes } from './StorageSettings/StorageSettings.utils' -import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' const FormSchema = z .object({ @@ -229,18 +229,17 @@ const CreateBucketModal = () => { New bucket + Create storage bucket + - - -
+ + + + { )} /> + - + - {isStandardBucket ? ( - <> + {isStandardBucket ? ( + <> + ( { )} /> - {isPublicBucket && ( - -

- Users can read objects in public buckets without any authorization. -

-

- Row level security (RLS) policies are still required for other - operations such as object uploads and deletes. -

- - } - /> - )} +
+ + {isPublicBucket && ( + +

+ Users can read objects in public buckets without any authorization. +

+

+ Row level security (RLS) policies are still required for other operations + such as object uploads and deletes. +

+ + } + /> + )} + + + + setShowConfiguration(!showConfiguration)} > - - +
{ /> - - ) : ( - <> - {icebergWrapperExtensionState === 'installed' ? ( - -

- Supabase will setup a + + + ) : ( + <> + {icebergWrapperExtensionState === 'installed' ? ( + +

+ Supabase will setup a + + foreign data wrapper + {bucketName && {`${bucketName}_fdw`}} + + + {' '} + for easier access to the data. This action will also create{' '} - foreign data wrapper - {bucketName && {`${bucketName}_fdw`}} + S3 Access Keys + {bucketName && ( + <> + {' '} + named {`${bucketName}_keys`} + + )} - - {' '} - for easier access to the data. This action will also create{' '} - - S3 Access Keys - {bucketName && ( - <> - {' '} - named {`${bucketName}_keys`} - - )} - - and - - four Vault Secrets - {bucketName && ( - <> - {' '} - prefixed with{' '} - {`${bucketName}_vault_`} - - )} - - . - -

+ and + + four Vault Secrets + {bucketName && ( + <> + {' '} + prefixed with{' '} + {`${bucketName}_vault_`} + + )} + + . + +

+

+ As a final step, you'll need to create an{' '} + Iceberg namespace before you + connect the Iceberg data to your database. +

+
+ ) : ( + + + + You need to install the Iceberg wrapper extension to connect your Analytic + bucket to your database. + +

- As a final step, you'll need to create an{' '} - Iceberg namespace before you - connect the Iceberg data to your database. + You need to install the wrappers{' '} + extension (with the minimum version of 0.5.3) if you want to + connect your Analytics bucket to your database.

- - ) : ( - - - - You need to install the Iceberg wrapper extension to connect your Analytic - bucket to your database. - - -

- You need to install the wrappers{' '} - extension (with the minimum version of 0.5.3) if you want to - connect your Analytics bucket to your database. -

-
-
- )} - - )} - - - +
+
+ )} + + )} + + + ) } - -export default DeleteBucketModal diff --git a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx index 975f340279ba0..79482cd1a3fc5 100644 --- a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx @@ -1,11 +1,10 @@ +import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' import { ChevronDown } from 'lucide-react' import Link from 'next/link' -import { useState } from 'react' -import { toast } from 'sonner' +import { useEffect, useState } from 'react' import { type SubmitHandler, useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' +import { toast } from 'sonner' import { Button, CollapsibleContent_Shadcn_, @@ -15,8 +14,8 @@ import { DialogContent, DialogFooter, DialogHeader, - DialogSectionSeparator, DialogSection, + DialogSectionSeparator, DialogTitle, FormControl_Shadcn_, FormField_Shadcn_, @@ -30,6 +29,7 @@ import { Switch, cn, } from 'ui' +import { z } from 'zod' import { StorageSizeUnits } from 'components/interfaces/Storage/StorageSettings/StorageSettings.constants' import { @@ -39,11 +39,11 @@ import { import { InlineLink } from 'components/ui/InlineLink' import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' import { useBucketUpdateMutation } from 'data/storage/bucket-update-mutation' +import { Bucket } from 'data/storage/buckets-query' import { IS_PLATFORM } from 'lib/constants' +import { isNonNullable } from 'lib/isNonNullable' import { Admonition } from 'ui-patterns' -import { Bucket } from 'data/storage/buckets-query' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { isNonNullable } from 'lib/isNonNullable' export interface EditBucketModalProps { visible: boolean @@ -128,6 +128,14 @@ export const EditBucketModal = ({ visible, bucket, onClose }: EditBucketModalPro ) } + useEffect(() => { + if (visible && bucket) { + setShowConfiguration(false) + const { unit } = convertFromBytes(bucket.file_size_limit ?? 0) + setSelectedUnit(unit) + } + }, [visible, bucket]) + return ( {`Edit bucket "${bucket?.name}"`} + - - - + + + + ( )} /> - {isChangingBucketVisibility && ( - - {isMakingBucketPublic ? ( -

`This will make all objects in your bucket publicly accessible.`

- ) : isMakingBucketPrivate ? ( -

- `All objects in your bucket will be private and only accessible via signed - URLs, or downloaded with the right authorisation headers.` -

- ) : null} +
- {isMakingBucketPrivate && ( + {isChangingBucketVisibility && ( + + {isMakingBucketPublic && ( +

This will make all objects in your bucket publicly accessible.

+ )} + + {isMakingBucketPrivate && ( + <> +

+ All objects in your bucket will be private and only accessible via signed + URLs, or downloaded with the right authorisation headers. +

- { - 'Assets cached in the CDN may still be publicly accessible. You can consider ' - } + Assets cached in the CDN may still be publicly accessible. You can + consider{' '} purging the cache - - {' or moving your assets to a new bucket.'} + {' '} + or moving your assets to a new bucket.

- )} - - } - /> - )} + + )} + + } + /> + )} + + + + setShowConfiguration(!showConfiguration)} > - - +
- - - + + + +
) } - -export default EmptyBucketModal diff --git a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx index ea63c932272ad..e5064dbbe0859 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx @@ -1,15 +1,15 @@ -import { describe, expect, it, beforeEach, vi } from 'vitest' -import { screen, waitFor, fireEvent } from '@testing-library/dom' +import { faker } from '@faker-js/faker' +import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' import { useState } from 'react' -import { faker } from '@faker-js/faker' +import { beforeEach, describe, expect, it, vi } from 'vitest' -import { addAPIMock } from 'tests/lib/msw' import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' import { Bucket } from 'data/storage/buckets-query' -import DeleteBucketModal from '../DeleteBucketModal' import { render } from 'tests/helpers' +import { addAPIMock } from 'tests/lib/msw' import { routerMock } from 'tests/lib/route-mock' +import { DeleteBucketModal } from '../DeleteBucketModal' const bucket: Bucket = { id: faker.string.uuid(), diff --git a/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx index 0ae722625860b..3dd0c9bb8feb1 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx @@ -1,14 +1,14 @@ -import { describe, expect, it, beforeEach, vi } from 'vitest' -import { screen, waitFor, fireEvent } from '@testing-library/dom' +import { faker } from '@faker-js/faker' +import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' import { useState } from 'react' -import { faker } from '@faker-js/faker' +import { beforeEach, describe, expect, it, vi } from 'vitest' -import { addAPIMock } from 'tests/lib/msw' import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' import { Bucket } from 'data/storage/buckets-query' import { render } from 'tests/helpers' -import EditBucketModal from '../EditBucketModal' +import { addAPIMock } from 'tests/lib/msw' +import { EditBucketModal } from '../EditBucketModal' const bucket: Bucket = { id: faker.string.uuid(), diff --git a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx index 8576210874584..914c4195fc0d2 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx @@ -1,15 +1,15 @@ -import { describe, expect, it, beforeEach, vi } from 'vitest' -import { screen, waitFor, fireEvent } from '@testing-library/dom' +import { faker } from '@faker-js/faker' +import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' import { useState } from 'react' -import { faker } from '@faker-js/faker' +import { beforeEach, describe, expect, it, vi } from 'vitest' -import { addAPIMock } from 'tests/lib/msw' import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' import { Bucket } from 'data/storage/buckets-query' -import EmptyBucketModal from '../EmptyBucketModal' import { render } from 'tests/helpers' +import { addAPIMock } from 'tests/lib/msw' import { routerMock } from 'tests/lib/route-mock' +import { EmptyBucketModal } from '../EmptyBucketModal' const bucket: Bucket = { id: faker.string.uuid(), diff --git a/apps/studio/components/interfaces/Storage/index.ts b/apps/studio/components/interfaces/Storage/index.ts index efecd4c782bcf..2cc7a39e25a75 100644 --- a/apps/studio/components/interfaces/Storage/index.ts +++ b/apps/studio/components/interfaces/Storage/index.ts @@ -2,4 +2,4 @@ export { default as StorageExplorer } from './StorageExplorer/StorageExplorer' export { default as StoragePolicies } from './StoragePolicies/StoragePolicies' export { default as StorageSettings } from './StorageSettings/StorageSettings' -export { default as DeleteBucketModal } from './DeleteBucketModal' +export { DeleteBucketModal } from './DeleteBucketModal' From b3bae9ec481e18977dee5b942bf436ac7b4dc48e Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Wed, 27 Aug 2025 07:34:06 +0200 Subject: [PATCH 3/7] add sentry log to permission query error (#38222) add permissions sentry logs --- apps/studio/data/permissions/permissions-query.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/studio/data/permissions/permissions-query.ts b/apps/studio/data/permissions/permissions-query.ts index 975786dd73bca..bad66b84e7278 100644 --- a/apps/studio/data/permissions/permissions-query.ts +++ b/apps/studio/data/permissions/permissions-query.ts @@ -1,4 +1,5 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query' +import * as Sentry from '@sentry/nextjs' import { useIsLoggedIn } from 'common' import { get, handleError } from 'data/fetchers' @@ -10,7 +11,13 @@ export type PermissionsResponse = Permission[] export async function getPermissions(signal?: AbortSignal) { const { data, error } = await get('/platform/profile/permissions', { signal }) - if (error) handleError(error) + if (error) { + handleError(error) + Sentry.withScope(function (scope) { + scope.setTag('permissions-query-error', true) + Sentry.captureException(error) + }) + } // [Joshen] TODO: Type this properly from the API return data as unknown as PermissionsResponse From 5e87a858ecd1b81fa2833807e1570b808727e023 Mon Sep 17 00:00:00 2001 From: Saxon Fletcher Date: Wed, 27 Aug 2025 15:41:06 +1000 Subject: [PATCH 4/7] Refine roles (#38225) * refine roles * copy --- .../Policies/PolicyTableRow/PolicyRow.tsx | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index 82a9085861427..dba2d2c7963a1 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -9,9 +9,7 @@ import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { - Badge, Button, - cn, TableRow, TableCell, DropdownMenu, @@ -57,6 +55,13 @@ const PolicyRow = ({ authConfig?.EXTERNAL_ANONYMOUS_USERS_ENABLED && (policy.roles.includes('authenticated') || policy.roles.includes('public')) + const displayedRoles = (() => { + const rolesWithAnonymous = appliesToAnonymousUsers + ? [...policy.roles, 'anonymous sign-ins'] + : policy.roles + return rolesWithAnonymous + })() + return ( @@ -68,9 +73,6 @@ const PolicyRow = ({ > {policy.name} - {appliesToAnonymousUsers ? ( - Applies to anonymous users - ) : null}
@@ -78,24 +80,25 @@ const PolicyRow = ({
-
- {policy.roles.slice(0, 3).map((role, i) => ( +
+ {displayedRoles.slice(0, 2).map((role, i) => ( {role} - {i < Math.min(policy.roles.length, 3) - 1 ? ', ' : ' '} + {i < Math.min(displayedRoles.length, 2) - 1 ? ', ' : ' '} ))} - {policy.roles.length > 1 ? 'roles' : 'role'}
- {policy.roles.length > 3 && ( + {displayedRoles.length > 2 && ( - - + {policy.roles.length - 3} more roles - +
+ + + {displayedRoles.length - 2} more + +
- {policy.roles.slice(3).join(', ')} + {displayedRoles.join(', ')}
)} From 4124f0ed980d274dbd9877290b417053304864e0 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 27 Aug 2025 13:42:20 +0700 Subject: [PATCH 5/7] Shift useFlag hook and configcat library to common package, remove from Studio (#38203) * Shift useFlag hook and configcat library to common package, remove from studio * Fix test * Fix test --- .../interfaces/App/AppBannerWrapper.tsx | 2 +- .../FeaturePreview/FeaturePreviewContext.tsx | 5 +- .../AddIntegrationDropdown.tsx | 2 +- .../BranchManagement/CreateBranchModal.tsx | 8 +- .../jwt-secret-keys-table/index.tsx | 5 +- .../interfaces/JwtSecrets/jwt-settings.tsx | 4 +- .../CostControl/CostControl.tsx | 5 +- .../Subscription/ExitSurveyModal.tsx | 3 +- .../Subscription/PaymentMethodSelection.tsx | 3 +- .../Subscription/Subscription.tsx | 3 +- .../ProjectCreation/RegionSelector.tsx | 3 +- .../interfaces/Settings/Addons/Addons.tsx | 3 +- .../Settings/Addons/CustomDomainSidePanel.tsx | 5 +- .../CustomDomainConfig/CustomDomainConfig.tsx | 3 +- .../ProjectUpgradeAlert.tsx | 3 +- .../Infrastructure/RestartServerButton.tsx | 2 +- .../TransferProjectButton.tsx | 2 +- .../Settings/Logs/LogsPreviewer.tsx | 3 +- .../__tests__/DeleteBucketModal.test.tsx | 4 +- .../__tests__/EmptyBucketModal.test.tsx | 2 +- .../layouts/DatabaseLayout/DatabaseLayout.tsx | 2 +- .../layouts/Integrations/layout.tsx | 2 +- .../layouts/LogsLayout/LogsSidebarMenuV2.tsx | 3 +- .../PausedState/ProjectPausedState.tsx | 4 +- .../layouts/ReportsLayout/ReportsMenu.tsx | 5 +- .../layouts/SignInLayout/SignInLayout.tsx | 9 +- .../ui/AIAssistantPanel/AIAssistant.tsx | 3 +- .../components/ui/DataTable/FilterSideBar.tsx | 3 +- apps/studio/components/ui/UpgradeToPro.tsx | 2 +- .../data/misc/get-default-region-query.ts | 2 +- apps/studio/hooks/ui/useFlag.ts | 14 +- apps/studio/hooks/use-check-latest-deploy.tsx | 3 +- apps/studio/package.json | 1 - apps/studio/pages/_app.tsx | 9 +- apps/studio/pages/new/[slug].tsx | 3 +- .../database/replication/[pipelineId].tsx | 3 +- .../[ref]/database/replication/index.tsx | 3 +- .../pages/project/[ref]/reports/database.tsx | 5 +- .../[ref]/settings/jwt/signing-keys.tsx | 2 +- .../lib => packages/common}/configcat.test.ts | 4 +- .../lib => packages/common}/configcat.ts | 14 +- packages/common/feature-flags.tsx | 16 + packages/common/index.tsx | 1 + packages/common/package.json | 6 +- pnpm-lock.yaml | 1273 ++--------------- 45 files changed, 189 insertions(+), 1273 deletions(-) rename {apps/studio/lib => packages/common}/configcat.test.ts (91%) rename {apps/studio/lib => packages/common}/configcat.ts (74%) diff --git a/apps/studio/components/interfaces/App/AppBannerWrapper.tsx b/apps/studio/components/interfaces/App/AppBannerWrapper.tsx index d661e01a25c6c..def1fe75b8800 100644 --- a/apps/studio/components/interfaces/App/AppBannerWrapper.tsx +++ b/apps/studio/components/interfaces/App/AppBannerWrapper.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren } from 'react' +import { useFlag } from 'common' import { ClockSkewBanner } from 'components/layouts/AppLayout/ClockSkewBanner' import IncidentBanner from 'components/layouts/AppLayout/IncidentBanner' import { NoticeBanner } from 'components/layouts/AppLayout/NoticeBanner' -import { useFlag } from 'hooks/ui/useFlag' import { OrganizationResourceBanner } from '../Organization/HeaderBanner' const AppBannerWrapper = ({ children }: PropsWithChildren<{}>) => { diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx index 8a244a0205d7e..76301d74f3356 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx @@ -10,9 +10,8 @@ import { useState, } from 'react' -import { FeatureFlagContext, LOCAL_STORAGE_KEYS } from 'common' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag, useIsRealtimeSettingsFFEnabled } from 'hooks/ui/useFlag' +import { FeatureFlagContext, LOCAL_STORAGE_KEYS, useFlag } from 'common' +import { useIsRealtimeSettingsFFEnabled } from 'hooks/ui/useFlag' import { EMPTY_OBJ } from 'lib/void' import { FEATURE_PREVIEWS } from './FeaturePreview.constants' diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/AddIntegrationDropdown.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/AddIntegrationDropdown.tsx index e03e9d3528b06..4ecfbb8c4e2ed 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/AddIntegrationDropdown.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/AddIntegrationDropdown.tsx @@ -1,6 +1,7 @@ import { ChevronDown } from 'lucide-react' import Image from 'next/image' +import { useFlag } from 'common' import { Button, cn, @@ -11,7 +12,6 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' -import { useFlag } from 'hooks/ui/useFlag' import { getIntegrationTypeIcon, getIntegrationTypeLabel, diff --git a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx index 2a774632f1863..7bfc6942c37b6 100644 --- a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx +++ b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx @@ -10,7 +10,7 @@ import { toast } from 'sonner' import * as z from 'zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { BranchingPITRNotice } from 'components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice' import AlertError from 'components/ui/AlertError' @@ -27,7 +27,6 @@ import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { BASE_PATH, IS_PLATFORM } from 'lib/constants' import { useAppStateSnapshot } from 'state/app-state' import { @@ -51,15 +50,16 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' export const CreateBranchModal = () => { - const allowDataBranching = useFlag('allowDataBranching') const { ref } = useParams() const router = useRouter() const queryClient = useQueryClient() const { data: projectDetails } = useSelectedProjectQuery() const { data: selectedOrg } = useSelectedOrganizationQuery() - const gitlessBranching = useIsBranching2Enabled() const { showCreateBranchModal, setShowCreateBranchModal } = useAppStateSnapshot() + const gitlessBranching = useIsBranching2Enabled() + const allowDataBranching = useFlag('allowDataBranching') + const isProPlanAndUp = selectedOrg?.plan?.id !== 'free' const promptProPlanUpgrade = IS_PLATFORM && !isProPlanAndUp diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx index ec3ee6d475f63..9a4375be508d5 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx @@ -3,7 +3,7 @@ import { RotateCw, Timer } from 'lucide-react' import { useMemo, useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useLegacyAPIKeysStatusQuery } from 'data/api-keys/legacy-api-keys-status-query' import { useJWTSigningKeyDeleteMutation } from 'data/jwt-signing-keys/jwt-signing-key-delete-mutation' @@ -12,7 +12,6 @@ import { JWTSigningKey, useJWTSigningKeysQuery } from 'data/jwt-signing-keys/jwt import { useLegacyJWTSigningKeyCreateMutation } from 'data/jwt-signing-keys/legacy-jwt-signing-key-create-mutation' import { useLegacyJWTSigningKeyQuery } from 'data/jwt-signing-keys/legacy-jwt-signing-key-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { AlertDialog, AlertDialogCancel, @@ -48,7 +47,7 @@ import { SigningKeyRow } from './signing-key-row' type DialogType = 'legacy' | 'create' | 'rotate' | 'key-details' | 'revoke' | 'delete' -export default function JWTSecretKeysTable() { +export const JWTSecretKeysTable = () => { const { ref: projectRef } = useParams() const { data: project, isLoading: isProjectLoading } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx index 5df90f4e49599..0f5a4b34ae057 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx @@ -4,7 +4,8 @@ import { JwtSecretUpdateProgress, JwtSecretUpdateStatus, } from '@supabase/shared-types/out/events' -import { useParams } from 'common' + +import { useFlag, useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { FormActions } from 'components/ui/Forms/FormActions' import Panel from 'components/ui/Panel' @@ -16,7 +17,6 @@ import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' import { useLegacyJWTSigningKeyQuery } from 'data/jwt-signing-keys/legacy-jwt-signing-key-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' -import { useFlag } from 'hooks/ui/useFlag' import { uuidv4 } from 'lib/helpers' import { AlertCircle, diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx index 79950849cabd0..c021252d87fc4 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx @@ -4,7 +4,7 @@ import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { ScaffoldSection, ScaffoldSectionContent, @@ -17,15 +17,14 @@ import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag } from 'hooks/ui/useFlag' import { BASE_PATH } from 'lib/constants' import { MANAGED_BY } from 'lib/constants/infrastructure' import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' import { Alert, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import PartnerIcon from 'components/ui/PartnerIcon' import ProjectUpdateDisabledTooltip from '../ProjectUpdateDisabledTooltip' import SpendCapSidePanel from './SpendCapSidePanel' -import PartnerIcon from 'components/ui/PartnerIcon' export interface CostControlProps {} diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx index ca96700cee511..d025396fab09d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx @@ -1,12 +1,11 @@ import { useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { CANCELLATION_REASONS } from 'components/interfaces/Billing/Billing.constants' import { useSendDowngradeFeedbackMutation } from 'data/feedback/exit-survey-send' import { ProjectInfo } from 'data/projects/projects-query' import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' -import { useFlag } from 'hooks/ui/useFlag' import { Alert, Button, cn, Input, Modal } from 'ui' import ProjectUpdateDisabledTooltip from '../ProjectUpdateDisabledTooltip' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx index 28ee8a2848e81..114ed71e19f01 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx @@ -14,7 +14,7 @@ import { } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' import { useOrganizationPaymentMethodSetupIntent } from 'data/organizations/organization-payment-method-setup-intent-mutation' @@ -22,7 +22,6 @@ import { useOrganizationPaymentMethodsQuery } from 'data/organizations/organizat import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query' import { SetupIntentResponse } from 'data/stripe/setup-intent-mutation' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag } from 'hooks/ui/useFlag' import { BASE_PATH, STRIPE_PUBLIC_KEY } from 'lib/constants' import { Checkbox_Shadcn_, Listbox } from 'ui' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx index 3c31b9a18c15b..ae9369046dc0a 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' import Link from 'next/link' +import { useFlag, useParams } from 'common' import { ScaffoldSection, ScaffoldSectionContent, @@ -12,7 +12,6 @@ import NoPermission from 'components/ui/NoPermission' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' -import { useFlag } from 'hooks/ui/useFlag' import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' import { Alert, Button } from 'ui' import { Admonition } from 'ui-patterns' diff --git a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx index 2c84cfef9e999..678dcd776d563 100644 --- a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx @@ -1,9 +1,8 @@ import { ControllerRenderProps, UseFormReturn } from 'react-hook-form' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { useDefaultRegionQuery } from 'data/misc/get-default-region-query' import { useOrganizationAvailableRegionsQuery } from 'data/organizations/organization-available-regions-query' -import { useFlag } from 'hooks/ui/useFlag' import { BASE_PATH, PROVIDERS } from 'lib/constants' import type { CloudProvider } from 'shared-data' import { diff --git a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx index 058c99f796b18..10bdd198f741f 100644 --- a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx @@ -5,7 +5,7 @@ import Image from 'next/image' import Link from 'next/link' import { useMemo } from 'react' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { getAddons, subscriptionHasHipaaAddon, @@ -35,7 +35,6 @@ import { useProjectByRefQuery, useSelectedProjectQuery, } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { getCloudProviderArchitecture } from 'lib/cloudprovider-utils' import { BASE_PATH, INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS } from 'lib/constants' import { getDatabaseMajorVersion, getSemanticVersion } from 'lib/helpers' diff --git a/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx index 26be3a22534e2..3f79a908bf7ec 100644 --- a/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx @@ -1,18 +1,17 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { AlertCircle, ExternalLink } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon-remove-mutation' import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import type { AddonVariantId } from 'data/subscriptions/types' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag } from 'hooks/ui/useFlag' import { formatCurrency } from 'lib/helpers' -import { AlertCircle, ExternalLink } from 'lucide-react' import { useAddonsPagePanel } from 'state/addons-page' import { Alert, diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx index 4b75d586b6426..ff61476ee0c1d 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx @@ -1,14 +1,13 @@ import { AlertCircle } from 'lucide-react' import Link from 'next/link' -import { useParams } from 'common' +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 { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag } from 'hooks/ui/useFlag' import CustomDomainActivate from './CustomDomainActivate' import CustomDomainDelete from './CustomDomainDelete' import CustomDomainVerify from './CustomDomainVerify' diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx index 97704722f051e..ac5ed945ab99b 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx @@ -8,7 +8,7 @@ import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { z } from 'zod' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { PLAN_DETAILS } from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' import { Markdown } from 'components/interfaces/Markdown' import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' @@ -20,7 +20,6 @@ import { ReleaseChannel } from 'data/projects/new-project.constants' import { useProjectUpgradeMutation } from 'data/projects/project-upgrade-mutation' import { setProjectStatus } from 'data/projects/projects-query' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useFlag } from 'hooks/ui/useFlag' import { PROJECT_STATUS } from 'lib/constants' import { AlertDescription_Shadcn_, diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx index 55be165b81bdd..8138ea7b1c0a0 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' +import { useFlag } from 'common' import { useIsProjectActive } from 'components/layouts/ProjectLayout/ProjectContext' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useProjectRestartMutation } from 'data/projects/project-restart-mutation' @@ -12,7 +13,6 @@ import { useProjectRestartServicesMutation } from 'data/projects/project-restart import { setProjectStatus } from 'data/projects/projects-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsAwsK8sCloudProvider, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { Button, DropdownMenu, diff --git a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx index 932ad84012e18..bca0a1f8bea6a 100644 --- a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx @@ -3,6 +3,7 @@ import { Loader, Shield, Users, Wrench } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' +import { useFlag } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { DocsButton } from 'components/ui/DocsButton' import { useOrganizationsQuery } from 'data/organizations/organizations-query' @@ -10,7 +11,6 @@ import { useProjectTransferMutation } from 'data/projects/project-transfer-mutat import { useProjectTransferPreviewQuery } from 'data/projects/project-transfer-preview-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { Button, InfoIcon, Listbox, Loading, Modal, WarningIcon } from 'ui' import { Admonition } from 'ui-patterns' diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx index c04be8882a9e5..1cdd6e97b2496 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx @@ -3,7 +3,7 @@ import { Rewind } from 'lucide-react' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import PreviewFilterPanel from 'components/interfaces/Settings/Logs/PreviewFilterPanel' import LoadingOpacity from 'components/ui/LoadingOpacity' import ShimmerLine from 'components/ui/ShimmerLine' @@ -14,7 +14,6 @@ import { useSelectedLog } from 'hooks/analytics/useSelectedLog' import useSingleLog from 'hooks/analytics/useSingleLog' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useUpgradePrompt } from 'hooks/misc/useUpgradePrompt' -import { useFlag } from 'hooks/ui/useFlag' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Button } from 'ui' import { LogsBarChart } from 'ui-patterns/LogsBarChart' diff --git a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx index e5064dbbe0859..4f173c4a52014 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx @@ -113,7 +113,7 @@ describe(`DeleteBucketModal`, () => { const input = screen.getByLabelText(/Type/) await userEvent.type(input, `test`) - const confirmButton = screen.getByRole(`button`, { name: `Delete Bucket` }) + const confirmButton = screen.getByRole(`button`, { name: `Delete bucket` }) fireEvent.click(confirmButton) await waitFor(() => expect(onClose).toHaveBeenCalledOnce()) @@ -131,7 +131,7 @@ describe(`DeleteBucketModal`, () => { const input = screen.getByLabelText(/Type/) await userEvent.type(input, `invalid`) - const confirmButton = screen.getByRole(`button`, { name: `Delete Bucket` }) + const confirmButton = screen.getByRole(`button`, { name: `Delete bucket` }) fireEvent.click(confirmButton) await waitFor(() => { diff --git a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx index 914c4195fc0d2..a9b79f4daa36b 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx @@ -87,7 +87,7 @@ describe(`EmptyBucketModal`, () => { await userEvent.click(openButton) await screen.findByRole(`dialog`) - const confirmButton = screen.getByRole(`button`, { name: `Empty Bucket` }) + const confirmButton = screen.getByRole(`button`, { name: `Empty bucket` }) fireEvent.click(confirmButton) diff --git a/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx b/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx index 0d71b585f89e1..4919aac04a7c7 100644 --- a/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx +++ b/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx @@ -1,6 +1,7 @@ import { useRouter } from 'next/router' import { PropsWithChildren } from 'react' +import { useFlag } from 'common' import { useIsColumnLevelPrivilegesEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { ProductMenu } from 'components/ui/ProductMenu' import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' @@ -8,7 +9,6 @@ import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { withAuth } from 'hooks/misc/withAuth' -import { useFlag } from 'hooks/ui/useFlag' import ProjectLayout from '../ProjectLayout/ProjectLayout' import { generateDatabaseMenu } from './DatabaseMenu.utils' diff --git a/apps/studio/components/layouts/Integrations/layout.tsx b/apps/studio/components/layouts/Integrations/layout.tsx index 10ed88f9571d9..8a0bd18923cc4 100644 --- a/apps/studio/components/layouts/Integrations/layout.tsx +++ b/apps/studio/components/layouts/Integrations/layout.tsx @@ -1,6 +1,7 @@ import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useRef, useState } from 'react' +import { useFlag } from 'common' import { useInstalledIntegrations } from 'components/interfaces/Integrations/Landing/useInstalledIntegrations' import { Header } from 'components/layouts/Integrations/header' import ProjectLayout from 'components/layouts/ProjectLayout/ProjectLayout' @@ -11,7 +12,6 @@ import ProductMenuItem from 'components/ui/ProductMenu/ProductMenuItem' import { useScroll } from 'framer-motion' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { withAuth } from 'hooks/misc/withAuth' -import { useFlag } from 'hooks/ui/useFlag' import { Menu, Separator } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { IntegrationTabs } from './tabs' diff --git a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx index 35a7b60cede58..c5f086fc59d65 100644 --- a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx +++ b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx @@ -3,7 +3,7 @@ import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' -import { IS_PLATFORM, useParams } from 'common' +import { IS_PLATFORM, useFlag, useParams } from 'common' import { useFeaturePreviewModal, useUnifiedLogsPreview, @@ -15,7 +15,6 @@ import { useContentQuery } from 'data/content/content-query' import { useReplicationSourcesQuery } from 'data/replication/sources-query' import { useCurrentOrgPlan } from 'hooks/misc/useCurrentOrgPlan' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useFlag } from 'hooks/ui/useFlag' import { Badge, Button, diff --git a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx index dcfc4bb4c9b1e..a369a28f2600e 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx @@ -9,7 +9,7 @@ import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { z } from 'zod' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { PostgresVersionSelector } from 'components/interfaces/ProjectCreation/PostgresVersionSelector' import AlertError from 'components/ui/AlertError' import { ButtonTooltip } from 'components/ui/ButtonTooltip' @@ -21,7 +21,7 @@ import { setProjectStatus } from 'data/projects/projects-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag, usePHFlag } from 'hooks/ui/useFlag' +import { usePHFlag } from 'hooks/ui/useFlag' import { PROJECT_STATUS } from 'lib/constants' import { AWS_REGIONS, CloudProvider } from 'shared-data' import { diff --git a/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx b/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx index d3d034eef97a5..b5a548c201609 100644 --- a/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx +++ b/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx @@ -2,10 +2,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' -import { useState, useMemo } from 'react' +import { useMemo, useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { CreateReportModal } from 'components/interfaces/Reports/CreateReportModal' import { UpdateCustomReportModal } from 'components/interfaces/Reports/UpdateModal' import { ButtonTooltip } from 'components/ui/ButtonTooltip' @@ -18,7 +18,6 @@ import { useProfile } from 'lib/profile' import { Menu, cn } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { ReportMenuItem } from './ReportMenuItem' -import { useFlag } from 'hooks/ui/useFlag' const ReportsMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx b/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx index 6243f55675b4d..5a97ecb7b262c 100644 --- a/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx +++ b/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx @@ -1,13 +1,14 @@ import { useQueryClient } from '@tanstack/react-query' -import { DocsButton } from 'components/ui/DocsButton' -import { useFlag } from 'hooks/ui/useFlag' -import { BASE_PATH } from 'lib/constants' -import { auth, buildPathWithParams, getAccessToken, getReturnToPath } from 'lib/gotrue' import { useTheme } from 'next-themes' import Image from 'next/legacy/image' import Link from 'next/link' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' + +import { useFlag } from 'common' +import { DocsButton } from 'components/ui/DocsButton' +import { BASE_PATH } from 'lib/constants' +import { auth, buildPathWithParams, getAccessToken, getReturnToPath } from 'lib/gotrue' import { tweets } from 'shared-data' type SignInLayoutProps = { diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx index b189896edd748..da0603309cafd 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx @@ -6,7 +6,7 @@ import { ArrowDown, Eraser, Info, Pencil, Settings, X } from 'lucide-react' import { useRouter } from 'next/router' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { LOCAL_STORAGE_KEYS } from 'common' +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' @@ -17,7 +17,6 @@ import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useOrgAiOptInLevel } from 'hooks/misc/useOrgOptedIntoAi' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { useHotKey } from 'hooks/ui/useHotKey' import { BASE_PATH, IS_PLATFORM } from 'lib/constants' import uuidv4 from 'lib/uuid' diff --git a/apps/studio/components/ui/DataTable/FilterSideBar.tsx b/apps/studio/components/ui/DataTable/FilterSideBar.tsx index c81d299fe34a6..d8cc32766ffbb 100644 --- a/apps/studio/components/ui/DataTable/FilterSideBar.tsx +++ b/apps/studio/components/ui/DataTable/FilterSideBar.tsx @@ -1,8 +1,7 @@ import { useRouter } from 'next/router' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { useUnifiedLogsPreview } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { useFlag } from 'hooks/ui/useFlag' import { Button, cn, ResizablePanel } from 'ui' import { FeaturePreviewSidebarPanel } from '../FeaturePreviewSidebarPanel' import { DateRangeDisabled } from './DataTable.types' diff --git a/apps/studio/components/ui/UpgradeToPro.tsx b/apps/studio/components/ui/UpgradeToPro.tsx index e3576c2722625..fe15d76aebf23 100644 --- a/apps/studio/components/ui/UpgradeToPro.tsx +++ b/apps/studio/components/ui/UpgradeToPro.tsx @@ -2,10 +2,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import Link from 'next/link' import { ReactNode } from 'react' +import { useFlag } from 'common' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { Button, cn } from 'ui' import { ButtonTooltip } from './ButtonTooltip' diff --git a/apps/studio/data/misc/get-default-region-query.ts b/apps/studio/data/misc/get-default-region-query.ts index 3a304a0250f5e..9273e585773a3 100644 --- a/apps/studio/data/misc/get-default-region-query.ts +++ b/apps/studio/data/misc/get-default-region-query.ts @@ -1,12 +1,12 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query' +import { useFlag } from 'common' import { COUNTRY_LAT_LON } from 'components/interfaces/ProjectCreation/ProjectCreation.constants' import { AWS_REGIONS_COORDINATES, FLY_REGIONS_COORDINATES, } from 'components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' import { fetchHandler } from 'data/fetchers' -import { useFlag } from 'hooks/ui/useFlag' import { getDistanceLatLonKM, tryParseJson } from 'lib/helpers' import type { CloudProvider } from 'shared-data' import { AWS_REGIONS, FLY_REGIONS } from 'shared-data' diff --git a/apps/studio/hooks/ui/useFlag.ts b/apps/studio/hooks/ui/useFlag.ts index 8dd5262287ecf..635c54343a482 100644 --- a/apps/studio/hooks/ui/useFlag.ts +++ b/apps/studio/hooks/ui/useFlag.ts @@ -1,6 +1,6 @@ import * as Sentry from '@sentry/nextjs' -import { useFeatureFlags } from 'common' +import { useFeatureFlags, useFlag } from 'common' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { trackFeatureFlag } from 'lib/posthog' @@ -9,18 +9,6 @@ const isObjectEmpty = (obj: Object) => { return Object.keys(obj).length === 0 } -export function useFlag(name: string) { - const flagStore = useFeatureFlags() - - const store = flagStore.configcat - - if (!isObjectEmpty(store) && store[name] === undefined) { - console.error(`Flag key "${name}" does not exist in ConfigCat flag store`) - return false - } - return store[name] as T -} - // TODO(Alaister): move this to packages/common/feature-flags.tsx and rename to useFlag export function usePHFlag(name: string) { const flagStore = useFeatureFlags() diff --git a/apps/studio/hooks/use-check-latest-deploy.tsx b/apps/studio/hooks/use-check-latest-deploy.tsx index eb09ccaeda3c0..f174e03f47d7e 100644 --- a/apps/studio/hooks/use-check-latest-deploy.tsx +++ b/apps/studio/hooks/use-check-latest-deploy.tsx @@ -3,10 +3,9 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { IS_PLATFORM } from 'common' +import { IS_PLATFORM, useFlag } from 'common' import { useDeploymentCommitQuery } from 'data/utils/deployment-commit-query' import { Button, StatusIcon } from 'ui' -import { useFlag } from './ui/useFlag' const DeployCheckToast = ({ id }: { id: string | number }) => { const router = useRouter() diff --git a/apps/studio/package.json b/apps/studio/package.json index 5951a073fd825..76f867c8c4b24 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -76,7 +76,6 @@ "common": "workspace:*", "common-tags": "^1.8.2", "config": "workspace:*", - "configcat-js": "^9.5.1", "cron-parser": "^4.9.0", "cronstrue": "^2.50.0", "dayjs": "^1.11.10", diff --git a/apps/studio/pages/_app.tsx b/apps/studio/pages/_app.tsx index edeb124fc6f6a..19e0af384908b 100644 --- a/apps/studio/pages/_app.tsx +++ b/apps/studio/pages/_app.tsx @@ -33,7 +33,13 @@ import { NuqsAdapter } from 'nuqs/adapters/next/pages' import { ErrorInfo } from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { FeatureFlagProvider, TelemetryTagManager, ThemeProvider, useThemeSandbox } from 'common' +import { + FeatureFlagProvider, + getFlags as getConfigCatFlags, + TelemetryTagManager, + ThemeProvider, + useThemeSandbox, +} from 'common' import MetaFaviconsPagesRouter from 'common/MetaFavicons/pages-router' import { RouteValidationWrapper } from 'components/interfaces/App' import { AppBannerContextProvider } from 'components/interfaces/App/AppBannerWrapperContext' @@ -45,7 +51,6 @@ import { GlobalErrorBoundaryState } from 'components/ui/GlobalErrorBoundaryState import { useRootQueryClient } from 'data/query-client' import { customFont, sourceCodePro } from 'fonts' import { AuthProvider } from 'lib/auth' -import { getFlags as getConfigCatFlags } from 'lib/configcat' import { API_URL, BASE_PATH, IS_PLATFORM } from 'lib/constants' import { ProfileProvider } from 'lib/profile' import { Telemetry } from 'lib/telemetry' diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index 16e115c33933e..11eecbd3aab08 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -11,7 +11,7 @@ import { z } from 'zod' import { PopoverSeparator } from '@ui/components/shadcn/ui/popover' import { components } from 'api-types' -import { LOCAL_STORAGE_KEYS, useParams } from 'common' +import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' import { FreeProjectLimitWarning, NotOrganizationOwnerWarning, @@ -53,7 +53,6 @@ import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { withAuth } from 'hooks/misc/withAuth' -import { useFlag } from 'hooks/ui/useFlag' import { getCloudProviderArchitecture } from 'lib/cloudprovider-utils' import { AWS_REGIONS_DEFAULT, diff --git a/apps/studio/pages/project/[ref]/database/replication/[pipelineId].tsx b/apps/studio/pages/project/[ref]/database/replication/[pipelineId].tsx index 2e45d0d18789b..916e5085309c3 100644 --- a/apps/studio/pages/project/[ref]/database/replication/[pipelineId].tsx +++ b/apps/studio/pages/project/[ref]/database/replication/[pipelineId].tsx @@ -1,13 +1,12 @@ import { useRouter } from 'next/router' import { useContext, useEffect } from 'react' -import { FeatureFlagContext, useParams } from 'common' +import { FeatureFlagContext, useFlag, useParams } from 'common' import { ReplicationPipelineStatus } from 'components/interfaces/Database/Replication/ReplicationPipelineStatus' import DatabaseLayout from 'components/layouts/DatabaseLayout/DatabaseLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import { FormHeader } from 'components/ui/Forms/FormHeader' -import { useFlag } from 'hooks/ui/useFlag' import { PipelineRequestStatusProvider } from 'state/replication-pipeline-request-status' import type { NextPageWithLayout } from 'types' diff --git a/apps/studio/pages/project/[ref]/database/replication/index.tsx b/apps/studio/pages/project/[ref]/database/replication/index.tsx index b89a4e10a1602..ee3b304caa7aa 100644 --- a/apps/studio/pages/project/[ref]/database/replication/index.tsx +++ b/apps/studio/pages/project/[ref]/database/replication/index.tsx @@ -1,4 +1,4 @@ -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import { ReplicationComingSoon } from 'components/interfaces/Database/Replication/ComingSoon' import { Destinations } from 'components/interfaces/Database/Replication/Destinations' import DatabaseLayout from 'components/layouts/DatabaseLayout/DatabaseLayout' @@ -7,7 +7,6 @@ import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import { FormHeader } from 'components/ui/Forms/FormHeader' import { UnknownInterface } from 'components/ui/UnknownInterface' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useFlag } from 'hooks/ui/useFlag' import { PipelineRequestStatusProvider } from 'state/replication-pipeline-request-status' import type { NextPageWithLayout } from 'types' diff --git a/apps/studio/pages/project/[ref]/reports/database.tsx b/apps/studio/pages/project/[ref]/reports/database.tsx index ace9855c9a8fa..48ab74b916f04 100644 --- a/apps/studio/pages/project/[ref]/reports/database.tsx +++ b/apps/studio/pages/project/[ref]/reports/database.tsx @@ -6,7 +6,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' +import { useFlag, useParams } from 'common' import ReportChart from 'components/interfaces/Reports/ReportChart' import ReportHeader from 'components/interfaces/Reports/ReportHeader' import ReportPadding from 'components/interfaces/Reports/ReportPadding' @@ -27,8 +27,8 @@ import { ReportSettings } from 'components/ui/Charts/ReportSettings' import GrafanaPromoBanner from 'components/ui/GrafanaPromoBanner' import Panel from 'components/ui/Panel' import { analyticsKeys } from 'data/analytics/keys' -import { useProjectDiskResizeMutation } from 'data/config/project-disk-resize-mutation' import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' +import { useProjectDiskResizeMutation } from 'data/config/project-disk-resize-mutation' import { useDatabaseSizeQuery } from 'data/database/database-size-query' import { useMaxConnectionsQuery } from 'data/database/max-connections-query' import { usePgbouncerConfigQuery } from 'data/database/pgbouncer-config-query' @@ -38,7 +38,6 @@ import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useReportDateRange } from 'hooks/misc/useReportDateRange' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useFlag } from 'hooks/ui/useFlag' import { formatBytes } from 'lib/helpers' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import type { NextPageWithLayout } from 'types' diff --git a/apps/studio/pages/project/[ref]/settings/jwt/signing-keys.tsx b/apps/studio/pages/project/[ref]/settings/jwt/signing-keys.tsx index 72f40dd8e683d..99b866a2e9498 100644 --- a/apps/studio/pages/project/[ref]/settings/jwt/signing-keys.tsx +++ b/apps/studio/pages/project/[ref]/settings/jwt/signing-keys.tsx @@ -1,6 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import JWTSecretKeysTable from 'components/interfaces/JwtSecrets/jwt-secret-keys-table' +import { JWTSecretKeysTable } from 'components/interfaces/JwtSecrets/jwt-secret-keys-table' import DefaultLayout from 'components/layouts/DefaultLayout' import JWTKeysLayout from 'components/layouts/JWTKeys/JWTKeysLayout' import SettingsLayout from 'components/layouts/ProjectSettingsLayout/SettingsLayout' diff --git a/apps/studio/lib/configcat.test.ts b/packages/common/configcat.test.ts similarity index 91% rename from apps/studio/lib/configcat.test.ts rename to packages/common/configcat.test.ts index 6fae420cc56f1..5dc0c3d14a638 100644 --- a/apps/studio/lib/configcat.test.ts +++ b/packages/common/configcat.test.ts @@ -1,5 +1,5 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' import * as configcat from 'configcat-js' +import { beforeEach, describe, expect, it, vi } from 'vitest' import { getFlags } from './configcat' vi.mock('data/fetchers', () => ({ @@ -34,7 +34,7 @@ describe('configcat', () => { const mockValues = { flag1: true, flag2: false } mockClient.getAllValuesAsync.mockResolvedValue(mockValues) - const { fetchHandler } = await import('data/fetchers') + const { fetchHandler } = await import('./configcat') const mockFetchHandler = fetchHandler as unknown as ReturnType mockFetchHandler.mockResolvedValueOnce( new Response(JSON.stringify({}), { diff --git a/apps/studio/lib/configcat.ts b/packages/common/configcat.ts similarity index 74% rename from apps/studio/lib/configcat.ts rename to packages/common/configcat.ts index d9745e0e2de9f..534a3b0a77dae 100644 --- a/apps/studio/lib/configcat.ts +++ b/packages/common/configcat.ts @@ -1,10 +1,20 @@ import * as configcat from 'configcat-js' -import { fetchHandler } from 'data/fetchers' let client: configcat.IConfigCatClient - const endpoint = '/configuration-files/configcat-proxy/frontend-v2/config_v6.json' +export const fetchHandler: typeof fetch = async (input, init) => { + try { + return await fetch(input, init) + } catch (err: any) { + if (err instanceof TypeError && err.message === 'Failed to fetch') { + console.error(err) + throw new Error('Unable to reach the server. Please check your network or try again later.') + } + throw err + } +} + async function getClient() { if (client) { return client diff --git a/packages/common/feature-flags.tsx b/packages/common/feature-flags.tsx index a871d6de12677..85413bff5caa6 100644 --- a/packages/common/feature-flags.tsx +++ b/packages/common/feature-flags.tsx @@ -141,3 +141,19 @@ export const FeatureFlagProvider = ({ export const useFeatureFlags = () => { return useContext(FeatureFlagContext) } + +const isObjectEmpty = (obj: Object) => { + return Object.keys(obj).length === 0 +} + +export function useFlag(name: string) { + const flagStore = useFeatureFlags() + + const store = flagStore.configcat + + if (!isObjectEmpty(store) && store[name] === undefined) { + console.error(`Flag key "${name}" does not exist in ConfigCat flag store`) + return false + } + return store[name] as T +} diff --git a/packages/common/index.tsx b/packages/common/index.tsx index 84a0675e8a435..eccb30018aedc 100644 --- a/packages/common/index.tsx +++ b/packages/common/index.tsx @@ -1,4 +1,5 @@ export * from './auth' +export * from './configcat' export * from './consent-state' export * from './constants' export * from './database-types' diff --git a/packages/common/package.json b/packages/common/package.json index 05d03bc9f5de6..804804f11f06b 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -15,6 +15,7 @@ "@usercentrics/cmp-browser-sdk": "^4.42.0", "api-types": "workspace:*", "config": "workspace:*", + "configcat-js": "^9.5.1", "dat.gui": "^0.7.9", "flags": "^4.0.0", "lodash": "^4.17.21", @@ -27,8 +28,11 @@ "@types/lodash": "4.17.5", "@types/react": "catalog:", "@types/react-dom": "catalog:", + "@vitest/coverage-v8": "^3.0.9", + "@vitest/ui": "^3.0.0", "tsconfig": "workspace:*", - "typescript": "~5.5.0" + "typescript": "~5.5.0", + "vitest": "^3.0.5" }, "peerDependencies": { "@supabase/auth-js": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d6ec1f378908..480f03fee1172 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -746,7 +746,7 @@ importers: version: 0.9.1(@types/node@22.13.14)(graphql-ws@5.14.1(graphql@16.11.0))(graphql@16.11.0) '@gregnr/postgres-meta': specifier: ^0.82.0-dev.2 - version: 0.82.0-dev.2(encoding@0.1.13) + version: 0.82.0-dev.2(encoding@0.1.13)(supports-color@8.1.1) '@hcaptcha/react-hcaptcha': specifier: ^1.12.0 version: 1.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -779,7 +779,7 @@ importers: version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/nextjs': specifier: ^10.3.0 - version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1)(webpack@5.94.0) + version: 10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@babel/core@7.26.10(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@18.3.1)(supports-color@8.1.1)(webpack@5.94.0) '@std/path': specifier: npm:@jsr/std__path@^1.0.8 version: '@jsr/std__path@1.0.8' @@ -794,10 +794,10 @@ importers: version: 2.71.1-rc.1 '@supabase/mcp-server-supabase': specifier: ^0.4.4 - version: 0.4.4 + version: 0.4.4(supports-color@8.1.1) '@supabase/mcp-utils': specifier: ^0.2.0 - version: 0.2.1 + version: 0.2.1(supports-color@8.1.1) '@supabase/pg-meta': specifier: workspace:* version: link:../../packages/pg-meta @@ -809,7 +809,7 @@ importers: version: 0.1.80 '@supabase/sql-to-rest': specifier: ^0.1.6 - version: 0.1.6(encoding@0.1.13) + version: 0.1.6(encoding@0.1.13)(supports-color@8.1.1) '@supabase/supabase-js': specifier: 'catalog:' version: 2.49.3 @@ -830,7 +830,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(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) + version: 4.3.4(supports-color@8.1.1)(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) '@zip.js/zip.js': specifier: ^2.7.29 version: 2.7.30 @@ -852,9 +852,6 @@ importers: config: specifier: workspace:* version: link:../../packages/config - configcat-js: - specifier: ^9.5.1 - version: 9.5.1 cron-parser: specifier: ^4.9.0 version: 4.9.0 @@ -917,13 +914,13 @@ importers: version: 0.52.2 next: specifier: 'catalog:' - version: 15.3.3(@babel/core@7.26.10)(@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) + version: 15.3.3(@babel/core@7.26.10(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) next-themes: 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.3.3(@babel/core@7.26.10)(@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) + version: 2.4.1(next@15.3.3(@babel/core@7.26.10(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) @@ -989,7 +986,7 @@ importers: version: 9.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: ^8.0.3 - version: 8.0.7(@types/react@18.3.3)(react@18.3.1) + version: 8.0.7(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1) react-resizable: specifier: 3.0.5 version: 3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1016,7 +1013,7 @@ importers: version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) remark-gfm: specifier: ^3.0.1 - version: 3.0.1 + version: 3.0.1(supports-color@8.1.1) shared-data: specifier: workspace:* version: link:../../packages/shared-data @@ -1062,7 +1059,7 @@ importers: version: 9.9.0 '@graphql-codegen/cli': specifier: 5.0.5 - version: 5.0.5(@parcel/watcher@2.5.1)(@types/node@22.13.14)(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)(typescript@5.5.2) + version: 5.0.5(@parcel/watcher@2.5.1)(@types/node@22.13.14)(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)(supports-color@8.1.1)(typescript@5.5.2) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.11.0) @@ -1074,7 +1071,7 @@ importers: version: 4.0.4 '@supabase/postgres-meta': specifier: ^0.64.4 - version: 0.64.6(encoding@0.1.13) + version: 0.64.6(encoding@0.1.13)(supports-color@8.1.1) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@22.13.14)(typescript@5.5.2))) @@ -1161,7 +1158,7 @@ importers: version: 4.4.2 '@vitest/coverage-v8': specifier: ^3.0.9 - version: 3.0.9(vitest@3.0.9) + version: 3.0.9(supports-color@8.1.1)(vitest@3.0.9) '@vitest/ui': specifier: ^3.0.0 version: 3.0.4(vitest@3.0.9) @@ -1176,7 +1173,7 @@ importers: version: link:../../packages/eslint-config-supabase eslint-plugin-barrel-files: specifier: ^2.0.7 - version: 2.0.7(eslint@8.57.0) + version: 2.0.7(eslint@8.57.0(supports-color@8.1.1)) graphql-ws: specifier: 5.14.1 version: 5.14.1(graphql@16.11.0) @@ -1191,7 +1188,7 @@ importers: version: 2.4.11(typescript@5.5.2) next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1) + version: 0.9.13(next@15.3.3(@babel/core@7.26.10(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@18.3.1) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -1203,7 +1200,7 @@ importers: version: 4.0.2(webpack@5.94.0) require-in-the-middle: specifier: ^7.5.2 - version: 7.5.2 + version: 7.5.2(supports-color@8.1.1) tailwindcss: specifier: ^3.4.1 version: 3.4.1(ts-node@10.9.2(@types/node@22.13.14)(typescript@5.5.2)) @@ -1218,10 +1215,10 @@ importers: version: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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(typescript@5.5.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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.5.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) apps/ui-library: dependencies: @@ -1842,7 +1839,7 @@ importers: version: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) packages/api-types: devDependencies: @@ -1885,6 +1882,9 @@ importers: config: specifier: workspace:* version: link:../config + configcat-js: + specifier: ^9.5.1 + version: 9.5.1 dat.gui: specifier: ^0.7.9 version: 0.7.9 @@ -1925,12 +1925,21 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 18.3.0 + '@vitest/coverage-v8': + specifier: ^3.0.9 + version: 3.0.9(supports-color@8.1.1)(vitest@3.0.9) + '@vitest/ui': + specifier: ^3.0.0 + version: 3.0.4(vitest@3.0.9) tsconfig: specifier: workspace:* version: link:../tsconfig typescript: specifier: ~5.5.0 version: 5.5.2 + vitest: + specifier: ^3.0.5 + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) packages/config: dependencies: @@ -2044,7 +2053,7 @@ importers: version: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) packages/shared-data: {} @@ -2286,7 +2295,7 @@ importers: version: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) packages/ui-patterns: dependencies: @@ -2455,7 +2464,7 @@ importers: version: link:../api-types next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@15.3.3(@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@18.3.1) + version: 0.9.13(next@15.3.3(@babel/core@7.26.10(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@18.3.1) tsx: specifier: ^4.19.3 version: 4.19.3 @@ -13065,9 +13074,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -14529,9 +14535,6 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -16737,10 +16740,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -19316,26 +19315,6 @@ snapshots: '@babel/compat-data@7.26.5': {} - '@babel/core@7.26.10': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.26.10 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.26.10(supports-color@8.1.1)': dependencies: '@ampproject/remapping': 2.3.0 @@ -19409,13 +19388,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.25.9(supports-color@8.1.1)': dependencies: '@babel/traverse': 7.27.0(supports-color@8.1.1) @@ -19432,15 +19404,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.27.0 @@ -19511,11 +19474,6 @@ snapshots: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10(supports-color@8.1.1))': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) @@ -19539,21 +19497,11 @@ snapshots: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10(supports-color@8.1.1))': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) @@ -19601,18 +19549,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.27.0(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.26.2 @@ -20283,29 +20219,10 @@ snapshots: eslint: 8.57.0(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} '@eslint-community/regexpp@4.9.1': {} - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': dependencies: ajv: 6.12.6 @@ -20371,10 +20288,10 @@ snapshots: dependencies: fast-deep-equal: 3.1.3 - '@fastify/swagger@8.15.0': + '@fastify/swagger@8.15.0(supports-color@8.1.1)': dependencies: fastify-plugin: 4.5.1 - json-schema-resolver: 2.0.0 + json-schema-resolver: 2.0.0(supports-color@8.1.1) openapi-types: 12.1.3 rfdc: 1.4.1 yaml: 2.4.5 @@ -20605,59 +20522,6 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-codegen/cli@5.0.5(@parcel/watcher@2.5.1)(@types/node@22.13.14)(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)(typescript@5.5.2)': - dependencies: - '@babel/generator': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - '@graphql-codegen/client-preset': 4.8.0(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0) - '@graphql-codegen/core': 4.0.2(graphql@16.11.0) - '@graphql-codegen/plugin-helpers': 5.1.0(graphql@16.11.0) - '@graphql-tools/apollo-engine-loader': 8.0.20(graphql@16.11.0) - '@graphql-tools/code-file-loader': 8.1.20(graphql@16.11.0) - '@graphql-tools/git-loader': 8.0.24(graphql@16.11.0) - '@graphql-tools/github-loader': 8.0.20(@types/node@22.13.14)(graphql@16.11.0) - '@graphql-tools/graphql-file-loader': 8.0.19(graphql@16.11.0) - '@graphql-tools/json-file-loader': 8.0.18(graphql@16.11.0) - '@graphql-tools/load': 8.1.0(graphql@16.11.0) - '@graphql-tools/prisma-loader': 8.0.17(@types/node@22.13.14)(encoding@0.1.13)(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.31(@types/node@22.13.14)(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@whatwg-node/fetch': 0.10.6 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.5.2) - debounce: 1.2.1 - detect-indent: 6.1.0 - graphql: 16.11.0 - graphql-config: 5.1.4(@types/node@22.13.14)(graphql@16.11.0)(typescript@5.5.2) - inquirer: 8.2.6 - is-glob: 4.0.3 - jiti: 1.21.7 - json-to-pretty-yaml: 1.2.2 - listr2: 4.0.5 - log-symbols: 4.1.0 - micromatch: 4.0.8 - shell-quote: 1.8.1 - string-env-interpolation: 1.0.1 - ts-log: 2.2.7 - tslib: 2.8.1 - yaml: 2.4.5 - yargs: 17.7.2 - optionalDependencies: - '@parcel/watcher': 2.5.1 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - cosmiconfig-toml-loader - - encoding - - enquirer - - graphql-sock - - supports-color - - typescript - - uWebSockets.js - - utf-8-validate - '@graphql-codegen/client-preset@4.8.0(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)': dependencies: '@babel/helper-plugin-utils': 7.26.5 @@ -20795,17 +20659,6 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/code-file-loader@8.1.20(graphql@16.11.0)': - dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - globby: 11.1.0 - graphql: 16.11.0 - tslib: 2.8.1 - unixify: 1.0.0 - transitivePeerDependencies: - - supports-color - '@graphql-tools/code-file-loader@8.1.20(graphql@16.11.0)(supports-color@8.1.1)': dependencies: '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.11.0)(supports-color@8.1.1) @@ -20895,18 +20748,6 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/git-loader@8.0.24(graphql@16.11.0)': - dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - graphql: 16.11.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - tslib: 2.8.1 - unixify: 1.0.0 - transitivePeerDependencies: - - supports-color - '@graphql-tools/git-loader@8.0.24(graphql@16.11.0)(supports-color@8.1.1)': dependencies: '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.11.0)(supports-color@8.1.1) @@ -20919,20 +20760,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@8.0.20(@types/node@22.13.14)(graphql@16.11.0)': - dependencies: - '@graphql-tools/executor-http': 1.3.3(@types/node@22.13.14)(graphql@16.11.0) - '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@whatwg-node/fetch': 0.10.6 - '@whatwg-node/promise-helpers': 1.3.1 - graphql: 16.11.0 - sync-fetch: 0.6.0-2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@types/node' - - supports-color - '@graphql-tools/github-loader@8.0.20(@types/node@22.13.14)(graphql@16.11.0)(supports-color@8.1.1)': dependencies: '@graphql-tools/executor-http': 1.3.3(@types/node@22.13.14)(graphql@16.11.0) @@ -20956,19 +20783,6 @@ snapshots: tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/graphql-tag-pluck@8.3.19(graphql@16.11.0)': - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - graphql: 16.11.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - '@graphql-tools/graphql-tag-pluck@8.3.19(graphql@16.11.0)(supports-color@8.1.1)': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) @@ -21016,34 +20830,6 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/prisma-loader@8.0.17(@types/node@22.13.14)(encoding@0.1.13)(graphql@16.11.0)': - dependencies: - '@graphql-tools/url-loader': 8.0.31(@types/node@22.13.14)(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - '@types/js-yaml': 4.0.6 - '@whatwg-node/fetch': 0.10.6 - chalk: 4.1.2 - debug: 4.4.0 - dotenv: 16.5.0 - graphql: 16.11.0 - graphql-request: 6.1.0(encoding@0.1.13)(graphql@16.11.0) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - jose: 5.9.6 - js-yaml: 4.1.0 - lodash: 4.17.21 - scuid: 1.1.0 - tslib: 2.8.1 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - bufferutil - - encoding - - supports-color - - uWebSockets.js - - utf-8-validate - '@graphql-tools/prisma-loader@8.0.17(@types/node@22.13.14)(encoding@0.1.13)(graphql@16.11.0)(supports-color@8.1.1)': dependencies: '@graphql-tools/url-loader': 8.0.31(@types/node@22.13.14)(graphql@16.11.0) @@ -21132,10 +20918,10 @@ snapshots: dependencies: graphql: 16.11.0 - '@gregnr/postgres-meta@0.82.0-dev.2(encoding@0.1.13)': + '@gregnr/postgres-meta@0.82.0-dev.2(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@fastify/cors': 9.0.1 - '@fastify/swagger': 8.15.0 + '@fastify/swagger': 8.15.0(supports-color@8.1.1) '@fastify/type-provider-typebox': 3.6.0(@sinclair/typebox@0.31.28) '@sinclair/typebox': 0.31.28 close-with-grace: 1.3.0 @@ -21146,7 +20932,7 @@ snapshots: pg-connection-string: 2.6.2 pg-format: 1.0.4 pg-protocol: 1.6.0 - pgsql-parser: 13.5.0(encoding@0.1.13) + pgsql-parser: 13.5.0(encoding@0.1.13)(supports-color@8.1.1) pino: 8.21.0 postgres-array: 3.0.2 prettier: 3.2.5 @@ -21219,14 +21005,6 @@ snapshots: dependencies: react-hook-form: 7.47.0(react@18.3.1) - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/config-array@0.11.14(supports-color@8.1.1)': dependencies: '@humanwhocodes/object-schema': 2.0.2 @@ -21650,21 +21428,6 @@ snapshots: dependencies: '@lezer/common': 1.2.3 - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0(encoding@0.1.13) - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.3 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)(supports-color@8.1.1)': dependencies: detect-libc: 2.0.3 @@ -21786,22 +21549,6 @@ snapshots: '@mjackson/node-fetch-server@0.2.0': {} - '@modelcontextprotocol/sdk@1.12.1': - dependencies: - ajv: 6.12.6 - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) - transitivePeerDependencies: - - supports-color - '@modelcontextprotocol/sdk@1.12.1(supports-color@8.1.1)': dependencies: ajv: 6.12.6 @@ -21965,16 +21712,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 - '@npmcli/agent@2.2.2': - dependencies: - agent-base: 7.1.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 10.4.3 - socks-proxy-agent: 8.0.3 - transitivePeerDependencies: - - supports-color - '@npmcli/agent@2.2.2(supports-color@8.1.1)': dependencies: agent-base: 7.1.3 @@ -22221,15 +21958,6 @@ snapshots: '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22239,16 +21967,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22259,13 +21977,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dataloader@0.21.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-dataloader@0.21.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22273,15 +21984,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22291,14 +21993,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22307,13 +22001,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22321,13 +22008,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22335,15 +22015,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22353,16 +22024,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22373,15 +22034,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22391,14 +22043,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-kafkajs@0.12.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-kafkajs@0.12.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22407,14 +22051,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22423,15 +22059,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22441,13 +22068,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22455,14 +22075,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22471,15 +22083,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22489,15 +22092,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql2@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-mysql2@0.49.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22507,15 +22101,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22525,18 +22110,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.55.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.4 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-pg@0.55.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22549,15 +22122,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-redis@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 - '@opentelemetry/semantic-conventions': 1.36.0 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-redis@0.51.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22567,15 +22131,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22585,14 +22140,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22601,15 +22148,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - import-in-the-middle: 1.14.2 - require-in-the-middle: 7.5.2 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -22619,18 +22157,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.14.2 - require-in-the-middle: 7.5.2 - semver: 7.7.1 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -23211,13 +22737,6 @@ snapshots: '@poppinss/exception@1.2.1': {} - '@prisma/instrumentation@6.13.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@prisma/instrumentation@6.13.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -25203,20 +24722,6 @@ snapshots: '@sentry-internal/replay-canvas': 10.3.0 '@sentry/core': 10.3.0 - '@sentry/bundler-plugin-core@4.0.2(encoding@0.1.13)': - dependencies: - '@babel/core': 7.26.10 - '@sentry/babel-plugin-component-annotate': 4.0.2 - '@sentry/cli': 2.51.1(encoding@0.1.13) - dotenv: 16.5.0 - find-up: 5.0.0 - glob: 9.3.5 - magic-string: 0.30.8 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - '@sentry/bundler-plugin-core@4.0.2(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@babel/core': 7.26.10(supports-color@8.1.1) @@ -25255,26 +24760,6 @@ snapshots: '@sentry/cli-win32-x64@2.51.1': optional: true - '@sentry/cli@2.51.1(encoding@0.1.13)': - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.51.1 - '@sentry/cli-linux-arm': 2.51.1 - '@sentry/cli-linux-arm64': 2.51.1 - '@sentry/cli-linux-i686': 2.51.1 - '@sentry/cli-linux-x64': 2.51.1 - '@sentry/cli-win32-arm64': 2.51.1 - '@sentry/cli-win32-i686': 2.51.1 - '@sentry/cli-win32-x64': 2.51.1 - transitivePeerDependencies: - - encoding - - supports-color - '@sentry/cli@2.51.1(encoding@0.1.13)(supports-color@8.1.1)': dependencies: https-proxy-agent: 5.0.1(supports-color@8.1.1) @@ -25349,32 +24834,6 @@ snapshots: - supports-color - webpack - '@sentry/nextjs@10.3.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1)(webpack@5.94.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.36.0 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.38.0) - '@sentry-internal/browser-utils': 10.3.0 - '@sentry/core': 10.3.0 - '@sentry/node': 10.3.0 - '@sentry/opentelemetry': 10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) - '@sentry/react': 10.3.0(react@18.3.1) - '@sentry/vercel-edge': 10.3.0 - '@sentry/webpack-plugin': 4.0.2(encoding@0.1.13)(webpack@5.94.0) - chalk: 3.0.0 - next: 15.3.3(@babel/core@7.26.10)(@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) - resolve: 1.22.8 - rollup: 4.38.0 - stacktrace-parser: 0.1.10 - transitivePeerDependencies: - - '@opentelemetry/context-async-hooks' - - '@opentelemetry/core' - - '@opentelemetry/sdk-trace-base' - - encoding - - react - - supports-color - - webpack - '@sentry/node-core@10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -25388,59 +24847,6 @@ snapshots: '@sentry/opentelemetry': 10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) import-in-the-middle: 1.14.2 - '@sentry/node-core@10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@sentry/core': 10.3.0 - '@sentry/opentelemetry': 10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) - import-in-the-middle: 1.14.2 - - '@sentry/node@10.3.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.12.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 - '@prisma/instrumentation': 6.13.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.3.0 - '@sentry/node-core': 10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) - '@sentry/opentelemetry': 10.3.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0) - import-in-the-middle: 1.14.2 - minimatch: 9.0.5 - transitivePeerDependencies: - - supports-color - '@sentry/node@10.3.0(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 @@ -25532,16 +24938,6 @@ snapshots: - encoding - supports-color - '@sentry/webpack-plugin@4.0.2(encoding@0.1.13)(webpack@5.94.0)': - dependencies: - '@sentry/bundler-plugin-core': 4.0.2(encoding@0.1.13) - unplugin: 1.0.1 - uuid: 9.0.1 - webpack: 5.94.0 - transitivePeerDependencies: - - encoding - - supports-color - '@serafin/schema-builder@0.18.5': dependencies: ajv: 8.12.0 @@ -26195,11 +25591,11 @@ snapshots: dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/mcp-server-supabase@0.4.4': + '@supabase/mcp-server-supabase@0.4.4(supports-color@8.1.1)': dependencies: '@deno/eszip': 0.84.0 - '@modelcontextprotocol/sdk': 1.12.1 - '@supabase/mcp-utils': 0.2.1 + '@modelcontextprotocol/sdk': 1.12.1(supports-color@8.1.1) + '@supabase/mcp-utils': 0.2.1(supports-color@8.1.1) common-tags: 1.8.2 graphql: 16.11.0 openapi-fetch: 0.13.8 @@ -26207,9 +25603,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@supabase/mcp-utils@0.2.1': + '@supabase/mcp-utils@0.2.1(supports-color@8.1.1)': dependencies: - '@modelcontextprotocol/sdk': 1.12.1 + '@modelcontextprotocol/sdk': 1.12.1(supports-color@8.1.1) zod: 3.25.76 zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: @@ -26219,12 +25615,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 - '@supabase/postgres-meta@0.64.6(encoding@0.1.13)': + '@supabase/postgres-meta@0.64.6(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@sinclair/typebox': 0.25.24 pg: 8.16.3 pg-format: 1.0.4 - pgsql-parser: 13.5.0(encoding@0.1.13) + pgsql-parser: 13.5.0(encoding@0.1.13)(supports-color@8.1.1) postgres-array: 3.0.2 prettier: 2.8.8 prettier-plugin-sql: 0.13.0(prettier@2.8.8) @@ -26260,15 +25656,6 @@ snapshots: '@supabase/shared-types@0.1.80': {} - '@supabase/sql-to-rest@0.1.6(encoding@0.1.13)': - dependencies: - '@babel/parser': 7.24.7 - libpg-query: 15.2.0(encoding@0.1.13) - prettier: 3.2.5 - transitivePeerDependencies: - - encoding - - supports-color - '@supabase/sql-to-rest@0.1.6(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@babel/parser': 7.24.7 @@ -27785,17 +27172,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5))': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) - transitivePeerDependencies: - - supports-color - '@vitest/coverage-v8@3.0.9(supports-color@8.1.1)(vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5))': dependencies: '@ampproject/remapping': 2.3.0 @@ -27828,25 +27204,25 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.0.9(vitest@3.0.9)': + '@vitest/coverage-v8@3.0.9(supports-color@8.1.1)(vitest@3.0.9)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 + istanbul-lib-source-maps: 5.0.6(supports-color@8.1.1) istanbul-reports: 3.1.7 magic-string: 0.30.17 magicast: 0.3.5 std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) transitivePeerDependencies: - supports-color @@ -27912,16 +27288,16 @@ snapshots: '@vitest/utils': 3.0.4 fflate: 0.8.2 flatted: 3.3.2 - pathe: 2.0.2 + pathe: 2.0.3 sirv: 3.0.0 - tinyglobby: 0.2.10 + tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) '@vitest/utils@3.0.4': dependencies: '@vitest/pretty-format': 3.0.4 - loupe: 3.1.2 + loupe: 3.1.3 tinyrainbow: 2.0.0 '@vitest/utils@3.0.9': @@ -28089,12 +27465,6 @@ snapshots: acorn@8.14.1: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - agent-base@6.0.2(supports-color@8.1.1): dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -28537,20 +27907,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.0 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - body-parser@2.2.0(supports-color@8.1.1): dependencies: bytes: 3.1.2 @@ -29513,20 +28869,12 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -30196,9 +29544,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-barrel-files@2.0.7(eslint@8.57.0): + eslint-plugin-barrel-files@2.0.7(eslint@8.57.0(supports-color@8.1.1)): dependencies: - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) eslint-barrel-file-utils: 0.0.10 requireindex: 1.2.0 @@ -30295,49 +29643,6 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@8.57.0: - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - eslint@8.57.0(supports-color@8.1.1): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0(supports-color@8.1.1)) @@ -30546,42 +29851,6 @@ snapshots: dependencies: express: 5.1.0(supports-color@8.1.1) - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@5.1.0(supports-color@8.1.1): dependencies: accepts: 2.0.0 @@ -30830,17 +30099,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.0(supports-color@8.1.1): dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -31772,22 +31030,13 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-proxy-agent@4.0.1: + http-proxy-agent@4.0.1(supports-color@8.1.1): dependencies: '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.0 + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - optional: true http-proxy-agent@5.0.0(supports-color@8.1.1): dependencies: @@ -31798,13 +31047,6 @@ snapshots: - supports-color optional: true - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: agent-base: 7.1.3 @@ -31826,13 +31068,6 @@ snapshots: http2-client@1.3.5: {} - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - https-proxy-agent@5.0.1(supports-color@8.1.1): dependencies: agent-base: 6.0.2(supports-color@8.1.1) @@ -31854,13 +31089,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.3 @@ -32388,14 +31616,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - istanbul-lib-source-maps@5.0.6(supports-color@8.1.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -32510,40 +31730,6 @@ snapshots: bezier-easing: 2.1.0 css-mediaquery: 0.1.2 - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.14.1 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.5.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.4 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 7.2.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.3 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - jsdom@20.0.3(supports-color@8.1.1): dependencies: abab: 2.0.6 @@ -32602,9 +31788,9 @@ snapshots: dependencies: fast-deep-equal: 3.1.3 - json-schema-resolver@2.0.0: + json-schema-resolver@2.0.0(supports-color@8.1.1): dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -32721,27 +31907,16 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - libpg-query@13.3.1(encoding@0.1.13): + libpg-query@13.3.1(encoding@0.1.13)(supports-color@8.1.1): dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@8.1.1) node-addon-api: 1.7.2 - node-gyp: 8.4.1 + node-gyp: 8.4.1(supports-color@8.1.1) transitivePeerDependencies: - bluebird - encoding - supports-color - libpg-query@15.2.0(encoding@0.1.13): - dependencies: - '@emnapi/runtime': 0.43.1 - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) - '@pgsql/types': 15.0.2 - node-addon-api: 7.1.0 - node-gyp: 10.1.0 - transitivePeerDependencies: - - encoding - - supports-color - libpg-query@15.2.0(encoding@0.1.13)(supports-color@8.1.1): dependencies: '@emnapi/runtime': 0.43.1 @@ -32926,8 +32101,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} - loupe@3.1.3: {} lower-case-first@2.0.2: @@ -32996,23 +32169,6 @@ snapshots: make-error@1.3.6: optional: true - make-fetch-happen@13.0.1: - dependencies: - '@npmcli/agent': 2.2.2 - cacache: 18.0.3 - http-cache-semantics: 4.1.1 - is-lambda: 1.0.1 - minipass: 7.1.2 - minipass-fetch: 3.0.5 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - proc-log: 4.2.0 - promise-retry: 2.0.1 - ssri: 10.0.6 - transitivePeerDependencies: - - supports-color - make-fetch-happen@13.0.1(supports-color@8.1.1): dependencies: '@npmcli/agent': 2.2.2(supports-color@8.1.1) @@ -33030,13 +32186,13 @@ snapshots: transitivePeerDependencies: - supports-color - make-fetch-happen@9.1.0: + make-fetch-happen@9.1.0(supports-color@8.1.1): dependencies: agentkeepalive: 4.5.0 cacache: 15.3.0 http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 + http-proxy-agent: 4.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1(supports-color@8.1.1) is-lambda: 1.0.1 lru-cache: 6.0.0 minipass: 3.3.6 @@ -33046,7 +32202,7 @@ snapshots: minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 + socks-proxy-agent: 6.2.1(supports-color@8.1.1) ssri: 8.0.1 transitivePeerDependencies: - bluebird @@ -33130,23 +32286,6 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.8 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - mdast-util-from-markdown@1.3.1(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 @@ -33253,15 +32392,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-table@1.0.7: - dependencies: - '@types/mdast': 3.0.15 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - mdast-util-gfm-table@1.0.7(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 @@ -33295,18 +32425,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm@2.0.2: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - mdast-util-gfm@2.0.2(supports-color@8.1.1): dependencies: mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) @@ -34066,28 +33184,6 @@ snapshots: micromark-util-types@2.0.0: {} - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.9 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - micromark@3.2.0(supports-color@8.1.1): dependencies: '@types/debug': 4.1.9 @@ -34454,12 +33550,7 @@ snapshots: dependencies: js-yaml-loader: 1.2.2 - next-router-mock@0.9.13(next@15.3.3(@babel/core@7.26.10)(@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@18.3.1): - dependencies: - next: 15.3.3(@babel/core@7.26.10)(@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: 18.3.1 - - next-router-mock@0.9.13(next@15.3.3(@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@18.3.1): + next-router-mock@0.9.13(next@15.3.3(@babel/core@7.26.10(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@18.3.1): dependencies: next: 15.3.3(@babel/core@7.26.10(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: 18.3.1 @@ -34505,34 +33596,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.3.3(@babel/core@7.26.10)(@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): - dependencies: - '@next/env': 15.3.3 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001695 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.6(@babel/core@7.26.10)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 15.3.3 - '@next/swc-darwin-x64': 15.3.3 - '@next/swc-linux-arm64-gnu': 15.3.3 - '@next/swc-linux-arm64-musl': 15.3.3 - '@next/swc-linux-x64-gnu': 15.3.3 - '@next/swc-linux-x64-musl': 15.3.3 - '@next/swc-win32-arm64-msvc': 15.3.3 - '@next/swc-win32-x64-msvc': 15.3.3 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.53.0 - sass: 1.77.4 - sharp: 0.34.1 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - nice-try@1.0.5: {} 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))(encoding@0.1.13)(supports-color@8.1.1)(typescript@5.5.2): @@ -34680,21 +33743,6 @@ snapshots: node-gyp-build@4.8.4: {} - node-gyp@10.1.0: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 10.4.5 - graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1 - nopt: 7.2.1 - proc-log: 3.0.0 - semver: 7.6.3 - tar: 6.2.1 - which: 4.0.0 - transitivePeerDependencies: - - supports-color - node-gyp@10.1.0(supports-color@8.1.1): dependencies: env-paths: 2.2.1 @@ -34710,12 +33758,12 @@ snapshots: transitivePeerDependencies: - supports-color - node-gyp@8.4.1: + node-gyp@8.4.1(supports-color@8.1.1): dependencies: env-paths: 2.2.1 glob: 7.2.3 graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 + make-fetch-happen: 9.1.0(supports-color@8.1.1) nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 @@ -34848,12 +33896,12 @@ snapshots: mitt: 3.0.1 next: 15.3.3(@babel/core@7.26.10(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.3.3(@babel/core@7.26.10)(@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.4.1(next@15.3.3(@babel/core@7.26.10(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 react: 18.3.1 optionalDependencies: - next: 15.3.3(@babel/core@7.26.10)(@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) + next: 15.3.3(@babel/core@7.26.10(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) nwsapi@2.2.20: @@ -35284,8 +34332,6 @@ snapshots: pathe@1.1.2: {} - pathe@2.0.2: {} - pathe@2.0.3: {} pathval@2.0.0: {} @@ -35427,10 +34473,10 @@ snapshots: dependencies: '@babel/runtime': 7.26.10 - pgsql-parser@13.5.0(encoding@0.1.13): + pgsql-parser@13.5.0(encoding@0.1.13)(supports-color@8.1.1): dependencies: '@babel/runtime': 7.26.10 - libpg-query: 13.3.1(encoding@0.1.13) + libpg-query: 13.3.1(encoding@0.1.13)(supports-color@8.1.1) minimist: 1.2.8 pgsql-deparser: 13.4.0 pgsql-enums: 13.1.3 @@ -36090,28 +35136,6 @@ snapshots: transitivePeerDependencies: - supports-color - react-markdown@8.0.7(@types/react@18.3.3)(react@18.3.1): - dependencies: - '@types/hast': 2.3.6 - '@types/prop-types': 15.7.8 - '@types/react': 18.3.3 - '@types/unist': 2.0.8 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.3.0 - react: 18.3.1 - react-is: 18.3.1 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.2 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - react-markdown@8.0.7(@types/react@18.3.3)(react@18.3.1)(supports-color@8.1.1): dependencies: '@types/hast': 2.3.6 @@ -36644,15 +35668,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-gfm@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - remark-gfm@3.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 @@ -36713,14 +35728,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-parse@10.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - remark-parse@10.0.2(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 @@ -36815,14 +35822,6 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.4.0 - module-details-from-path: 1.0.3 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - require-in-the-middle@7.5.2(supports-color@8.1.1): dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -36940,16 +35939,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.38.0 fsevents: 2.3.3 - router@2.2.0: - dependencies: - debug: 4.4.0 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.1.0 - transitivePeerDependencies: - - supports-color - router@2.2.0(supports-color@8.1.1): dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -37122,22 +36111,6 @@ snapshots: transitivePeerDependencies: - supports-color - send@1.2.0: - dependencies: - debug: 4.4.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - send@1.2.0(supports-color@8.1.1): dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -37177,15 +36150,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - serve-static@2.2.0(supports-color@8.1.1): dependencies: encodeurl: 2.0.0 @@ -37506,18 +36470,10 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - socks-proxy-agent@6.2.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.0 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks-proxy-agent@8.0.3: + socks-proxy-agent@6.2.1(supports-color@8.1.1): dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -37904,13 +36860,6 @@ snapshots: '@babel/core': 7.26.10(supports-color@8.1.1) babel-plugin-macros: 3.1.0 - styled-jsx@5.1.6(@babel/core@7.26.10)(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - optionalDependencies: - '@babel/core': 7.26.10 - stylis@4.2.0: {} stylis@4.3.1: {} @@ -38205,11 +37154,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -39215,27 +38159,6 @@ snapshots: - tsx - yaml - vite-node@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): - dependencies: - cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 - pathe: 2.0.3 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.5.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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) @@ -39247,17 +38170,6 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)): - dependencies: - debug: 4.3.7 - globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.5.2) - optionalDependencies: - vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) - transitivePeerDependencies: - - supports-color - - typescript - vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): dependencies: esbuild: 0.25.2 @@ -39292,7 +38204,7 @@ snapshots: tsx: 4.20.3 yaml: 2.4.5 - vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): + vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.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.4.11(typescript@5.5.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5)) @@ -39302,7 +38214,7 @@ snapshots: '@vitest/spy': 3.0.9 '@vitest/utils': 3.0.9 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17 pathe: 2.0.3 @@ -39312,12 +38224,12 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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.4.2)(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.4.2)(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: '@types/node': 22.13.14 '@vitest/ui': 3.0.4(vitest@3.0.9) - jsdom: 20.0.3 + jsdom: 20.0.3(supports-color@8.1.1) transitivePeerDependencies: - jiti - less @@ -39332,10 +38244,10 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5): + vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.4)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.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.5.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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.5.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -39351,11 +38263,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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.4.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.4.5) + vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.14 + '@vitest/ui': 3.0.4(vitest@3.0.9) jsdom: 20.0.3(supports-color@8.1.1) transitivePeerDependencies: - jiti @@ -39371,10 +38284,10 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5): + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.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.5.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.13.14)(typescript@5.5.2))(vite@6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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 @@ -39390,8 +38303,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) - vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(yaml@2.4.5) + vite: 6.3.5(@types/node@22.13.14)(jiti@2.4.2)(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.4.2)(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: '@types/node': 22.13.14 @@ -39472,7 +38385,7 @@ snapshots: webpack@5.94.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 From 0af359a86495d75ba62c75bc6d87c29cd398088f Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 27 Aug 2025 14:09:58 +0700 Subject: [PATCH 6/7] Swap to use paginated projects endpoint (#38192) --- .../interfaces/Account/AuditLogs.tsx | 3 +- .../App/CommandMenu/OrgProjectSwitcher.tsx | 12 +++---- .../interfaces/App/RouteValidationWrapper.tsx | 3 +- .../Billing/NoProjectsOnPaidOrgInfo.tsx | 7 ++-- .../Home/ProjectList/ProjectList.tsx | 4 ++- .../VercelGithub/IntegrationConnection.tsx | 6 ++-- .../VercelGithub/IntegrationPanels.tsx | 12 ++++--- .../Organization/AuditLogs/AuditLogs.tsx | 6 ++-- .../Subscription/PlanUpdateSidePanel.tsx | 8 ++--- .../AwsMarketplaceLinkExistingOrg.tsx | 35 ++++++++++--------- .../SidePanelVercelProjectLinker.tsx | 6 ++-- .../Organization/NewOrg/NewOrgForm.tsx | 26 +++++++------- .../Organization/OrganizationCard.tsx | 3 +- .../TeamSettings/InviteMemberButton.tsx | 4 +-- .../TeamSettings/MemberActions.tsx | 3 +- .../Organization/TeamSettings/MemberRow.tsx | 7 ++-- .../UpdateRolesConfirmationModal.tsx | 3 +- .../UpdateRolesPanel/UpdateRolesPanel.tsx | 3 +- .../interfaces/Organization/Usage/Usage.tsx | 6 ++-- .../interfaces/Support/AIAssistantOption.tsx | 8 +++-- .../interfaces/Support/SupportFormV2.tsx | 8 ++--- .../layouts/AppLayout/ProjectDropdown.tsx | 6 ++-- .../NotificationsFilter.tsx | 5 +-- .../NotificationsPopover.tsx | 6 ++-- .../layouts/ProjectLayout/LoadingState.tsx | 7 ++-- .../layouts/ProjectLayout/ProjectLayout.tsx | 2 +- apps/studio/data/projects/projects-query.ts | 11 ++++-- apps/studio/hooks/misc/useSelectedProject.ts | 2 +- apps/studio/lib/ai/org-ai-details.ts | 2 +- .../[slug]/marketplace/choose-project.tsx | 4 +-- apps/studio/pages/new/[slug].tsx | 2 +- apps/studio/pages/support/new.tsx | 4 +-- 32 files changed, 125 insertions(+), 99 deletions(-) diff --git a/apps/studio/components/interfaces/Account/AuditLogs.tsx b/apps/studio/components/interfaces/Account/AuditLogs.tsx index 9b774a17b9c81..5ba7a31df6177 100644 --- a/apps/studio/components/interfaces/Account/AuditLogs.tsx +++ b/apps/studio/components/interfaces/Account/AuditLogs.tsx @@ -29,7 +29,8 @@ const AuditLogs = () => { projects: [], // project_ref[] }) - const { data: projects } = useProjectsQuery() + const { data: projectsData } = useProjectsQuery() + const projects = projectsData?.projects ?? [] const { data: organizations } = useOrganizationsQuery() const { data, error, isLoading, isSuccess, isError, isRefetching, refetch } = useProfileAuditLogsQuery( diff --git a/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx b/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx index c3de2c3f6331b..518dbd536ed6a 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx @@ -1,10 +1,10 @@ -import { Forward, Wrench, Building } from 'lucide-react' +import { Building, Forward, Wrench } from 'lucide-react' import { useMemo } from 'react' -import { useProjectsQuery } from 'data/projects/projects-query' +import { IS_PLATFORM } from 'common' import { useOrganizationsQuery } from 'data/organizations/organizations-query' +import { useProjectsQuery } from 'data/projects/projects-query' import { PageType, useRegisterCommands, useRegisterPage, useSetPage } from 'ui-patterns/CommandMenu' -import { IS_PLATFORM } from 'common' import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' const PROJECT_SWITCHER_PAGE_NAME = 'Switch project' @@ -13,10 +13,10 @@ const ORGANIZATION_SWITCHER_PAGE_NAME = 'Configure organization' export function useProjectSwitchCommand() { const setPage = useSetPage() - const { data: _projects } = useProjectsQuery({ enabled: IS_PLATFORM }) + const { data } = useProjectsQuery({ enabled: IS_PLATFORM }) const projects = useMemo( - () => (_projects ?? []).map(({ name, ref }) => ({ name, ref })), - [_projects] + () => (data?.projects ?? []).map(({ name, ref }) => ({ name, ref })), + [data] ) useRegisterPage( diff --git a/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx b/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx index 4ddb8e1039dbb..55aa8393983df 100644 --- a/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx +++ b/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx @@ -77,9 +77,10 @@ const RouteValidationWrapper = ({ children }: PropsWithChildren<{}>) => { } }, [orgsInitialized]) - const { data: projects, isSuccess: projectsInitialized } = useProjectsQuery({ + const { data, isSuccess: projectsInitialized } = useProjectsQuery({ enabled: isLoggedIn, }) + const projects = data?.projects ?? [] const projectsRef = useLatest(projects) useEffect(() => { diff --git a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx index 4a71ccc0e3bc0..84f685f70bfb2 100644 --- a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx +++ b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx @@ -1,16 +1,17 @@ import { useProjectsQuery } from 'data/projects/projects-query' +import Link from 'next/link' import type { Organization } from 'types' import { Admonition } from 'ui-patterns' -import Link from 'next/link' interface NoProjectsOnPaidOrgInfoProps { organization?: Organization } export const NoProjectsOnPaidOrgInfo = ({ organization }: NoProjectsOnPaidOrgInfoProps) => { - const { data: allProjects } = useProjectsQuery({}) + const { data } = useProjectsQuery({}) const projectCount = - allProjects?.filter((project) => project.organization_id === organization?.id).length ?? 0 + (data?.projects ?? []).filter((project) => project.organization_id === organization?.id) + .length ?? 0 if ( projectCount > 0 || diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx index d2285dceee6e8..4ce7a0a194ced 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx @@ -35,12 +35,14 @@ export const ProjectList = ({ const organization = organization_ ?? selectedOrganization const { - data: allProjects = [], + data, isLoading: isLoadingProjects, isSuccess: isSuccessProjects, isError: isErrorProjects, error: projectsError, } = useProjectsQuery() + const allProjects = data?.projects ?? [] + const { isLoading: _isLoadingPermissions, isError: isErrorPermissions, diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx index b036d5976e760..be63d1469d6fb 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx @@ -34,8 +34,10 @@ const IntegrationConnectionItem = forwardRef project.ref === connection.supabase_project_ref) + const { data } = useProjectsQuery() + const project = (data?.projects ?? []).find( + (project) => project.ref === connection.supabase_project_ref + ) const isBranchingEnabled = project?.is_branch_enabled === true const [isOpen, setIsOpen] = useState(false) diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx index 7cff4c2b66cbf..f394f3c1ec198 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx @@ -149,8 +149,10 @@ const IntegrationConnection = forwardRef { - const { data: projects } = useProjectsQuery() - const project = projects?.find((project) => project.ref === connection.supabase_project_ref) + const { data } = useProjectsQuery() + const project = (data?.projects ?? []).find( + (project) => project.ref === connection.supabase_project_ref + ) return (
  • ( ({ connection, type, ...props }, ref) => { - const { data: projects } = useProjectsQuery() - const project = projects?.find((project) => project.ref === connection.supabase_project_ref) + const { data } = useProjectsQuery() + const project = (data?.projects ?? []).find( + (project) => project.ref === connection.supabase_project_ref + ) return (
  • { const canReadAuditLogs = useCheckPermissions(PermissionAction.READ, 'notifications') - const { data: projects } = useProjectsQuery() + const { data: projectsData } = useProjectsQuery() + const projects = projectsData?.projects ?? [] const { data: organizations } = useOrganizationsQuery() const { data: members } = useOrganizationMembersQuery({ slug }) const { data: rolesData } = useOrganizationRolesV2Query({ slug }) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx index d037fb1706942..d084514da4a1b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx @@ -20,9 +20,11 @@ import type { OrgPlan } from 'data/subscriptions/types' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from 'lib/constants/infrastructure' import { formatCurrency } from 'lib/helpers' import { plans as subscriptionsPlans } from 'shared-data/plans' import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' +import { Organization } from 'types/base' import { Button, SidePanel, cn } from 'ui' import DowngradeModal from './DowngradeModal' import { EnterpriseCard } from './EnterpriseCard' @@ -30,8 +32,6 @@ import { ExitSurveyModal } from './ExitSurveyModal' import MembersExceedLimitModal from './MembersExceedLimitModal' import { SubscriptionPlanUpdateDialog } from './SubscriptionPlanUpdateDialog' import UpgradeSurveyModal from './UpgradeModal' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { Organization } from 'types/base' const getPartnerManagedResourceCta = (selectedOrganization: Organization) => { if (selectedOrganization.managed_by === MANAGED_BY.VERCEL_MARKETPLACE) { @@ -64,8 +64,8 @@ const PlanUpdateSidePanel = () => { PermissionAction.BILLING_WRITE, 'stripe.subscriptions' ) - const { data: allProjects } = useProjectsQuery() - const orgProjects = (allProjects || []).filter( + const { data: projectsData } = useProjectsQuery() + const orgProjects = (projectsData?.projects ?? []).filter( (it) => it.organization_id === selectedOrganization?.id ) diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx index c00b2b3fa0eb4..7b25463cd948e 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx @@ -1,3 +1,12 @@ +import { zodResolver } from '@hookform/resolvers/zod' +import { RadioGroupCard, RadioGroupCardItem } from '@ui/components/radio-group-card' +import { cn } from '@ui/lib/utils' +import { Boxes, ChevronRight } from 'lucide-react' +import Link from 'next/link' +import { useRouter } from 'next/router' +import { useMemo, useState } from 'react' +import { SubmitHandler, useForm } from 'react-hook-form' +import { toast } from 'sonner' import { Button, Collapsible_Shadcn_, @@ -7,31 +16,22 @@ import { FormField_Shadcn_, Skeleton, } from 'ui' -import { RadioGroupCard, RadioGroupCardItem } from '@ui/components/radio-group-card' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { cn } from '@ui/lib/utils' -import { ActionCard } from '../../../ui/ActionCard' -import { Boxes, ChevronRight } from 'lucide-react' +import { z } from 'zod' +import { useOrganizationLinkAwsMarketplaceMutation } from '../../../../data/organizations/organization-link-aws-marketplace-mutation' +import { useProjectsQuery } from '../../../../data/projects/projects-query' +import { Organization } from '../../../../types' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, } from '../../../layouts/Scaffold' +import { ActionCard } from '../../../ui/ActionCard' import { ButtonTooltip } from '../../../ui/ButtonTooltip' -import { z } from 'zod' -import { SubmitHandler, useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' -import { useMemo, useState } from 'react' -import { Organization } from '../../../../types' -import { useProjectsQuery } from '../../../../data/projects/projects-query' -import { useOrganizationLinkAwsMarketplaceMutation } from '../../../../data/organizations/organization-link-aws-marketplace-mutation' -import { toast } from 'sonner' -import AwsMarketplaceOnboardingSuccessModal from './AwsMarketplaceOnboardingSuccessModal' -import NewAwsMarketplaceOrgModal from './NewAwsMarketplaceOrgModal' -import { useRouter } from 'next/router' import AwsMarketplaceAutoRenewalWarning from './AwsMarketplaceAutoRenewalWarning' +import AwsMarketplaceOnboardingSuccessModal from './AwsMarketplaceOnboardingSuccessModal' import { CloudMarketplaceOnboardingInfo } from './cloud-marketplace-query' -import Link from 'next/link' +import NewAwsMarketplaceOrgModal from './NewAwsMarketplaceOrgModal' interface Props { organizations?: Organization[] | undefined @@ -92,7 +92,8 @@ const AwsMarketplaceLinkExistingOrg = ({ return { orgsLinkable: linkable, orgsNotLinkable: notLinkable } }, [sortedOrganizations, onboardingInfo?.organization_linking_eligibility]) - const { data: projects = [] } = useProjectsQuery() + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] const [isNotLinkableOrgListOpen, setIsNotLinkableOrgListOpen] = useState(false) const [orgLinkedSuccessfully, setOrgLinkedSuccessfully] = useState(false) diff --git a/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx index 717c20edd603d..b9eeabe7b7c4e 100644 --- a/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx +++ b/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -48,16 +48,16 @@ const SidePanelVercelProjectLinker = () => { /** * Supabase projects available */ - const { data: supabaseProjectsData } = useProjectsQuery({ + const { data } = useProjectsQuery({ enabled: organizationIntegrationId !== undefined, }) const supabaseProjects = useMemo( () => - supabaseProjectsData + (data?.projects ?? []) ?.filter((project) => project.organization_id === selectedOrganization?.id) .map((project) => ({ name: project.name, ref: project.ref })) ?? EMPTY_ARR, - [selectedOrganization?.id, supabaseProjectsData] + [selectedOrganization?.id, data] ) const { data: vercelProjectsData } = useVercelProjectsQuery( diff --git a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx index 8128ed29eb481..d45d3c039d0a2 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx @@ -9,14 +9,22 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { toast } from 'sonner' import { z } from 'zod' +import { loadStripe } from '@stripe/stripe-js' import { LOCAL_STORAGE_KEYS } from 'common' +import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' +import { PaymentConfirmation } from 'components/interfaces/Billing/Payment/PaymentConfirmation' import SpendCapModal from 'components/interfaces/Billing/SpendCapModal' import Panel from 'components/ui/Panel' import { useOrganizationCreateMutation } from 'data/organizations/organization-create-mutation' import { useOrganizationsQuery } from 'data/organizations/organizations-query' +import type { CustomerAddress, CustomerTaxId } from 'data/organizations/types' import { useProjectsQuery } from 'data/projects/projects-query' +import { SetupIntentResponse } from 'data/stripe/setup-intent-mutation' +import { useConfirmPendingSubscriptionCreateMutation } from 'data/subscriptions/org-subscription-confirm-pending-create' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { PRICING_TIER_LABELS_ORG, STRIPE_PUBLIC_KEY } from 'lib/constants' +import { useProfile } from 'lib/profile' +import { useTheme } from 'next-themes' import { Button, Input_Shadcn_, @@ -32,19 +40,10 @@ import { TooltipTrigger, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' -import { useConfirmPendingSubscriptionCreateMutation } from 'data/subscriptions/org-subscription-confirm-pending-create' -import { loadStripe } from '@stripe/stripe-js' -import { useTheme } from 'next-themes' -import { SetupIntentResponse } from 'data/stripe/setup-intent-mutation' -import { useProfile } from 'lib/profile' -import { PaymentConfirmation } from 'components/interfaces/Billing/Payment/PaymentConfirmation' -import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' import { NewPaymentMethodElement, type PaymentMethodElementRef, } from '../BillingSettings/PaymentMethods/NewPaymentMethodElement' -import { components } from 'api-types' -import type { CustomerAddress, CustomerTaxId } from 'data/organizations/types' const ORG_KIND_TYPES = { PERSONAL: 'Personal', @@ -102,10 +101,11 @@ const newMandatoryAddressInput = true const NewOrgForm = ({ onPaymentMethodReset, setupIntent, onPlanSelected }: NewOrgFormProps) => { const router = useRouter() const user = useProfile() - const { data: organizations, isSuccess } = useOrganizationsQuery() - const { data: projects } = useProjectsQuery() const { resolvedTheme } = useTheme() + const { data: organizations, isSuccess } = useOrganizationsQuery() + const { data } = useProjectsQuery() + const [lastVisitedOrganization] = useLocalStorageQuery( LOCAL_STORAGE_KEYS.LAST_VISITED_ORGANIZATION, '' @@ -114,8 +114,8 @@ const NewOrgForm = ({ onPaymentMethodReset, setupIntent, onPlanSelected }: NewOr const freeOrgs = (organizations || []).filter((it) => it.plan.id === 'free') const projectsByOrg = useMemo(() => { - return _.groupBy(projects || [], 'organization_slug') - }, [projects]) + return _.groupBy(data?.projects ?? [], 'organization_slug') + }, [data]) const [isOrgCreationConfirmationModalVisible, setIsOrgCreationConfirmationModalVisible] = useState(false) diff --git a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx index e636c1e34ba1a..0e3c77246e9c4 100644 --- a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx +++ b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx @@ -15,7 +15,8 @@ export const OrganizationCard = ({ href?: string }) => { const isUserMFAEnabled = useIsMFAEnabled() - const { data: allProjects = [] } = useProjectsQuery() + const { data } = useProjectsQuery() + const allProjects = data?.projects ?? [] const numProjects = allProjects.filter((x) => x.organization_slug === organization.slug).length const isMfaRequired = organization.organization_requires_mfa diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx index 35e10d24095c9..244c40cd725c4 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx @@ -66,12 +66,12 @@ export const InviteMemberButton = () => { const [isOpen, setIsOpen] = useState(false) const [projectDropdownOpen, setProjectDropdownOpen] = useState(false) - const { data: projects } = useProjectsQuery() + const { data } = useProjectsQuery() const { data: members } = useOrganizationMembersQuery({ slug }) const { data: allRoles, isSuccess } = useOrganizationRolesV2Query({ slug }) const orgScopedRoles = allRoles?.org_scoped_roles ?? [] - const orgProjects = (projects ?? []) + const orgProjects = (data?.projects ?? []) .filter((project) => project.organization_id === organization?.id) .sort((a, b) => a.name.localeCompare(b.name)) diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx index 112f830292f80..9b3108a1f3076 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx @@ -45,10 +45,11 @@ export const MemberActions = ({ member }: MemberActionsProps) => { const { data: selectedOrganization } = useSelectedOrganizationQuery() const { data: permissions } = usePermissionsQuery() - const { data: allProjects } = useProjectsQuery() + const { data } = useProjectsQuery() const { data: members } = useOrganizationMembersQuery({ slug }) const { data: allRoles } = useOrganizationRolesV2Query({ slug }) + const allProjects = data?.projects ?? [] const memberIsUser = member.gotrue_id == profile?.gotrue_id const orgScopedRoles = allRoles?.org_scoped_roles ?? [] const projectScopedRoles = allRoles?.project_scoped_roles ?? [] diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx index ce683309f802e..befed92d41f2b 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx @@ -15,9 +15,9 @@ import { HoverCardTrigger_Shadcn_, HoverCard_Shadcn_, ScrollArea, - cn, - TableRow, TableCell, + TableRow, + cn, } from 'ui' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import { isInviteExpired } from '../Organization.utils' @@ -35,7 +35,8 @@ export const MemberRow = ({ member }: MemberRowProps) => { const { profile } = useProfile() const { data: selectedOrganization } = useSelectedOrganizationQuery() - const { data: projects } = useProjectsQuery() + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] const { data: roles, isLoading: isLoadingRoles } = useOrganizationRolesV2Query({ slug: selectedOrganization?.slug, }) diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx index 711fe647580d7..1b7a0a482dea2 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx @@ -39,8 +39,9 @@ export const UpdateRolesConfirmationModal = ({ const { slug } = useParams() const queryClient = useQueryClient() const { data: organization } = useSelectedOrganizationQuery() - const { data: projects } = useProjectsQuery() const { data: allRoles } = useOrganizationRolesV2Query({ slug: organization?.slug }) + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] // [Joshen] Separate saving state instead of using RQ due to several successive steps const [saving, setSaving] = useState(false) diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx index 57d0fd6f9eb94..0ba9e50848d4a 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx @@ -61,7 +61,8 @@ export const UpdateRolesPanel = ({ visible, member, onClose }: UpdateRolesPanelP const { data: organization } = useSelectedOrganizationQuery() const isOptedIntoProjectLevelPermissions = useHasAccessToProjectLevelPermissions(slug as string) - const { data: projects } = useProjectsQuery() + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] const { data: permissions } = usePermissionsQuery() const { data: allRoles, isSuccess: isSuccessRoles } = useOrganizationRolesV2Query({ slug }) diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx index 32420143d36bb..506e02109f978 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx @@ -38,7 +38,7 @@ const Usage = () => { ) const { data: organization } = useSelectedOrganizationQuery() - const { data: projects, isSuccess } = useProjectsQuery() + const { data, isSuccess } = useProjectsQuery() const { data: subscription, error: subscriptionError, @@ -47,7 +47,9 @@ const Usage = () => { isSuccess: isSuccessSubscription, } = useOrgSubscriptionQuery({ orgSlug: slug }) - const orgProjects = projects?.filter((project) => project.organization_id === organization?.id) + const orgProjects = (data?.projects ?? []).filter( + (project) => project.organization_id === organization?.id + ) useEffect(() => { if (projectRef && isSuccess && orgProjects !== undefined) { diff --git a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx index debff627760f3..055ee41a9c6ff 100644 --- a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx +++ b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx @@ -1,7 +1,7 @@ import { useProjectsQuery } from 'data/projects/projects-query' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { AnimatePresence, motion } from 'framer-motion' -import { MessageSquare, X } from 'lucide-react' +import { MessageSquare } from 'lucide-react' import Link from 'next/link' import { useCallback, useEffect, useState } from 'react' import { Button } from 'ui' @@ -17,9 +17,11 @@ export const AIAssistantOption = ({ organizationSlug, isCondensed = false, }: AIAssistantOptionProps) => { - const [isVisible, setIsVisible] = useState(isCondensed ? true : false) - const { data: projects } = useProjectsQuery() + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] + const { mutate: sendEvent } = useSendEventMutation() + const [isVisible, setIsVisible] = useState(isCondensed ? true : false) useEffect(() => { const timer = setTimeout(() => setIsVisible(true), 800) diff --git a/apps/studio/components/interfaces/Support/SupportFormV2.tsx b/apps/studio/components/interfaces/Support/SupportFormV2.tsx index a194baa25e60d..7246e96887c9b 100644 --- a/apps/studio/components/interfaces/Support/SupportFormV2.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormV2.tsx @@ -140,11 +140,9 @@ export const SupportFormV2 = ({ () => organizations?.find((org) => org.slug === organizationSlug), [organizationSlug, organizations] ) - const { - data: allProjects, - isLoading: isLoadingProjects, - isSuccess: isSuccessProjects, - } = useProjectsQuery() + const { data, isLoading: isLoadingProjects, isSuccess: isSuccessProjects } = useProjectsQuery() + const allProjects = data?.projects ?? [] + const { mutate: sendEvent } = useSendEventMutation() const { mutate: submitSupportTicket } = useSendSupportTicketMutation({ diff --git a/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx b/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx index bebe326aab6d3..afabafbead6ec 100644 --- a/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx @@ -91,15 +91,15 @@ export const ProjectDropdown = () => { const router = useRouter() const { ref } = useParams() const { data: project } = useSelectedProjectQuery() - const { data: allProjects, isLoading: isLoadingProjects } = useProjectsQuery() + const { data, isLoading: isLoadingProjects } = useProjectsQuery() const { data: selectedOrganization } = useSelectedOrganizationQuery() const projectCreationEnabled = useIsFeatureEnabled('projects:create') const isBranch = project?.parentRef !== project?.ref - const projects = allProjects - ?.filter((x) => x.organization_id === selectedOrganization?.id) + const projects = (data?.projects ?? []) + .filter((x) => x.organization_id === selectedOrganization?.id) .sort((a, b) => a.name.localeCompare(b.name)) const selectedProject = isBranch ? projects?.find((p) => p.ref === project?.parentRef) diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsFilter.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsFilter.tsx index c8c9a2c78134f..ba8ee16dc2678 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsFilter.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsFilter.tsx @@ -19,17 +19,18 @@ import { } from 'ui' import { CommandGroup } from '@ui/components/shadcn/ui/command' -import { CriticalIcon, WarningIcon } from 'ui' import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { useProjectsQuery } from 'data/projects/projects-query' import { useNotificationsStateSnapshot } from 'state/notifications' +import { CriticalIcon, WarningIcon } from 'ui' export const NotificationsFilter = ({ activeTab }: { activeTab: 'inbox' | 'archived' }) => { const [open, setOpen] = useState(false) const snap = useNotificationsStateSnapshot() const { data: organizations } = useOrganizationsQuery() - const { data: projects } = useProjectsQuery() + const { data } = useProjectsQuery() + const projects = data?.projects ?? [] return ( diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsPopover.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsPopover.tsx index e610bb3a4e170..1e30b9525a155 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsPopover.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/NotificationsPopoverV2/NotificationsPopover.tsx @@ -3,6 +3,7 @@ import { useMemo, useRef, useState } from 'react' import { toast } from 'sonner' import AlertError from 'components/ui/AlertError' +import { ButtonTooltip } from 'components/ui/ButtonTooltip' import InfiniteList from 'components/ui/InfiniteList' import ShimmeringLoader, { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useNotificationsArchiveAllMutation } from 'data/notifications/notifications-v2-archive-all-mutation' @@ -24,7 +25,6 @@ import { } from 'ui' import NotificationRow from './NotificationRow' import { NotificationsFilter } from './NotificationsFilter' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' export const NotificationsPopoverV2 = () => { const [open, setOpen] = useState(false) @@ -40,7 +40,9 @@ export const NotificationsPopoverV2 = () => { // so opting to simplify and implement it here for now const rowHeights = useRef<{ [key: number]: number }>({}) - const { data: projects } = useProjectsQuery({ enabled: open }) + const { data: projectsData } = useProjectsQuery({ enabled: open }) + const projects = projectsData?.projects ?? [] + const { data: organizations } = useOrganizationsQuery({ enabled: open }) const { data, diff --git a/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx b/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx index 25f46fb6bdb37..36da56931d606 100644 --- a/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx @@ -2,9 +2,10 @@ import { useParams } from 'common' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useProjectsQuery } from 'data/projects/projects-query' -const LoadingState = () => { +export const LoadingState = () => { const { ref } = useParams() - const { data: allProjects, isLoading } = useProjectsQuery() + const { data, isLoading } = useProjectsQuery() + const allProjects = data?.projects ?? [] const projectName = ref !== 'default' @@ -37,8 +38,6 @@ const LoadingState = () => { ) } -export default LoadingState - export const ProjectUsageLoadingState = () => { return (
    diff --git a/apps/studio/components/layouts/ProjectLayout/ProjectLayout.tsx b/apps/studio/components/layouts/ProjectLayout/ProjectLayout.tsx index fb9c5bcf9fa2a..47e0c76f2b90b 100644 --- a/apps/studio/components/layouts/ProjectLayout/ProjectLayout.tsx +++ b/apps/studio/components/layouts/ProjectLayout/ProjectLayout.tsx @@ -22,7 +22,7 @@ import MobileSheetNav from 'ui-patterns/MobileSheetNav/MobileSheetNav' import { useEditorType } from '../editors/EditorsLayout.hooks' import BuildingState from './BuildingState' import ConnectingState from './ConnectingState' -import LoadingState from './LoadingState' +import { LoadingState } from './LoadingState' import { ProjectPausedState } from './PausedState/ProjectPausedState' import PauseFailedState from './PauseFailedState' import PausingState from './PausingState' diff --git a/apps/studio/data/projects/projects-query.ts b/apps/studio/data/projects/projects-query.ts index 5059f538adf24..6b37ad3ab94be 100644 --- a/apps/studio/data/projects/projects-query.ts +++ b/apps/studio/data/projects/projects-query.ts @@ -12,7 +12,8 @@ export type ProjectsVariables = { ref?: string } -export type ProjectInfo = components['schemas']['ProjectInfo'] +type PaginatedProjectsResponse = components['schemas']['ListProjectsPaginatedResponse'] +export type ProjectInfo = PaginatedProjectsResponse['projects'][number] export async function getProjects({ signal, @@ -21,10 +22,14 @@ export async function getProjects({ signal?: AbortSignal headers?: Record }) { - const { data, error } = await get('/platform/projects', { signal, headers }) + const { data, error } = await get('/platform/projects', { + signal, + headers: { ...headers, Version: '2' }, + }) if (error) handleError(error) - return data as ProjectInfo[] + // [Joshen] API TS issue + return data as unknown as PaginatedProjectsResponse } export type ProjectsData = Awaited> diff --git a/apps/studio/hooks/misc/useSelectedProject.ts b/apps/studio/hooks/misc/useSelectedProject.ts index 9159cccb8f069..88a4d3c2eb3e8 100644 --- a/apps/studio/hooks/misc/useSelectedProject.ts +++ b/apps/studio/hooks/misc/useSelectedProject.ts @@ -28,7 +28,7 @@ export function useProjectByRefQuery(ref?: string) { const projectsQuery = useProjectsQuery({ enabled: isLoggedIn, select: (data) => { - return data.find((project) => project.ref === ref) + return data.projects.find((project) => project.ref === ref) }, }) diff --git a/apps/studio/lib/ai/org-ai-details.ts b/apps/studio/lib/ai/org-ai-details.ts index b2e394dde4755..4c04eaa2fe25f 100644 --- a/apps/studio/lib/ai/org-ai-details.ts +++ b/apps/studio/lib/ai/org-ai-details.ts @@ -27,7 +27,7 @@ export const getOrgAIDetails = async ({ ]) const selectedOrg = organizations.find((org) => org.slug === orgSlug) - const selectedProject = projects.find( + const selectedProject = projects.projects.find( (project) => project.ref === projectRef || project.preview_branch_refs.includes(projectRef) ) diff --git a/apps/studio/pages/integrations/vercel/[slug]/marketplace/choose-project.tsx b/apps/studio/pages/integrations/vercel/[slug]/marketplace/choose-project.tsx index 51a722e19345e..c283adf4a15cd 100644 --- a/apps/studio/pages/integrations/vercel/[slug]/marketplace/choose-project.tsx +++ b/apps/studio/pages/integrations/vercel/[slug]/marketplace/choose-project.tsx @@ -59,8 +59,8 @@ const VercelIntegration: NextPageWithLayout = () => { const supabaseProjects = useMemo( () => - supabaseProjectsData - ?.filter( + (supabaseProjectsData?.projects ?? []) + .filter( (project) => project.organization_id === organization?.id && (project.status === PROJECT_STATUS['ACTIVE_HEALTHY'] || diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index 11eecbd3aab08..1612259122d49 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -429,7 +429,7 @@ const Wizard: NextPageWithLayout = () => { useEffect(() => { // Only set once to ensure compute credits dont change while project is being created if (allProjectsFromApi && !allProjects) { - setAllProjects(allProjectsFromApi) + setAllProjects(allProjectsFromApi.projects) } }, [allProjectsFromApi, allProjects, setAllProjects]) diff --git a/apps/studio/pages/support/new.tsx b/apps/studio/pages/support/new.tsx index 0c1f57637cd60..c3e402d615575 100644 --- a/apps/studio/pages/support/new.tsx +++ b/apps/studio/pages/support/new.tsx @@ -91,7 +91,7 @@ const SupportPage: NextPageWithLayout = () => { ) : ( { Project name ID
  • - {projectsData?.map((project) => ( + {(projectsData?.projects ?? []).map((project) => (
  • + {!!bucket && ( + + )} {policies.length === 0 ? (

    No policies created yet

    ) : ( -
    - {policies.map((policy: any) => ( - - ))} -
    + + + + + Name + Command + Applied to + + Actions + + + + + {policies.map((policy) => ( + onSelectPolicyEdit(p, bucket?.name ?? '', table)} + onSelectDeletePolicy={onSelectPolicyDelete} + /> + ))} + +
    +
    )} ) } - -export default StoragePoliciesBucketRow diff --git a/apps/studio/pages/project/[ref]/realtime/policies.tsx b/apps/studio/pages/project/[ref]/realtime/policies.tsx index 028d3990d2e4b..54dea9feff308 100644 --- a/apps/studio/pages/project/[ref]/realtime/policies.tsx +++ b/apps/studio/pages/project/[ref]/realtime/policies.tsx @@ -2,15 +2,35 @@ import { RealtimePolicies } from 'components/interfaces/Realtime/Policies' import type { NextPageWithLayout } from 'types' import DefaultLayout from 'components/layouts/DefaultLayout' +import { PageLayout } from 'components/layouts/PageLayout/PageLayout' import RealtimeLayout from 'components/layouts/RealtimeLayout/RealtimeLayout' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' +import { DocsButton } from 'components/ui/DocsButton' const RealtimePoliciesPage: NextPageWithLayout = () => { - return + return ( + + + + + + ) } RealtimePoliciesPage.getLayout = (page) => ( - {page} + + + } + size="large" + > + {page} + + )