diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 0e8de49a0f3..e97bda26030 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -70,6 +70,11 @@ jobs: continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + with: + sparse-checkout: | + packages/ui + patches - name: Download coverage artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: diff --git a/apps/design-system/content/docs/components/sheet.mdx b/apps/design-system/content/docs/components/sheet.mdx index 75edbb53860..5ef059a69bf 100644 --- a/apps/design-system/content/docs/components/sheet.mdx +++ b/apps/design-system/content/docs/components/sheet.mdx @@ -13,13 +13,11 @@ source: 1. **Use for side panels** - - Forms with multiple fields - Settings panels - Detailed editors 2. **Consider screen size** - - Sheets work well on desktop - On mobile, consider full-screen or bottom sheet variants diff --git a/apps/design-system/content/docs/icons.mdx b/apps/design-system/content/docs/icons.mdx index eefdbb97749..e433bceab58 100644 --- a/apps/design-system/content/docs/icons.mdx +++ b/apps/design-system/content/docs/icons.mdx @@ -52,7 +52,6 @@ function app() { Follow these steps to add a new custom icon to the Supabase icon library. 1. **Create SVG file**: Add your SVG file to `packages/icons/src/raw-icons/` with a kebab-case name (e.g., `my-new-icon.svg`). Make sure it follows these requirements: - - Exported at 24×24px with `viewBox="0 0 24 24"` - Uses `stroke="currentColor"` for strokes (no hardcoded colors) - Uses `stroke-width="1.5"` (deviate based on optical weight if necessary) diff --git a/apps/design-system/content/docs/ui-patterns/forms.mdx b/apps/design-system/content/docs/ui-patterns/forms.mdx index eb71580c536..8c2794495f5 100644 --- a/apps/design-system/content/docs/ui-patterns/forms.mdx +++ b/apps/design-system/content/docs/ui-patterns/forms.mdx @@ -32,7 +32,6 @@ Forms in side panels (Sheets) use `FormItemLayout` with `layout="horizontal"` on 1. **Always use FormItemLayout**: Use `FormItemLayout` instead of manually composing `FormItem`, `FormLabel`, `FormMessage`, and `FormDescription`. 2. **Layout selection**: - - Use `layout="flex-row-reverse"` for page layouts (horizontal alignment) - Use `layout="horizontal"` for side panels with more width - Use `layout="vertical"` for side panels with limited width diff --git a/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx b/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx index 4a6e51cb3b6..cf0abdbf7b8 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx @@ -1,5 +1,5 @@ - per 1 million invocations. You are only charged for usage exceeding your subscription -plan's quota. + per 1 million invocations. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | --------- | --------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx index 8ba7741e9b9..7ff5176ad63 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx @@ -1,6 +1,6 @@ ## Pricing - per SSO MAU. You are only charged for usage exceeding your subscription plan's -quota. + per SSO MAU. You are only charged for usage exceeding your subscription +plan's quota. For a detailed breakdown of how charges are calculated, refer to [Manage Monthly Active SSO Users usage](/docs/guides/platform/manage-your-usage/monthly-active-users-sso). diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx index cbfccef3877..05f5adbca7e 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx @@ -1,6 +1,6 @@ ## Pricing - per Third-Party MAU. You are only charged for usage exceeding your subscription -plan's quota. + per Third-Party MAU. You are only charged for usage exceeding your +subscription plan's quota. For a detailed breakdown of how charges are calculated, refer to [Manage Monthly Active Third-Party Users usage](/docs/guides/platform/manage-your-usage/monthly-active-users-third-party). diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx index 6708ec7a9d0..8cc187a5a5e 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx @@ -1,7 +1,7 @@ ## Pricing - per hour ( per month) for the first project. per -hour ( per month) for every additional project. + per hour ( per month) for the first project. + per hour ( per month) for every additional project. | Plan | Project 1 per month | Project 2 per month | Project 3 per month | | ---------- | -------------------- | -------------------- | -------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx b/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx index 5e8737d0af3..5f744d4d79f 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx @@ -1,5 +1,5 @@ - per 1,000 peak connections. You are only charged for usage exceeding your subscription -plan's quota. + per 1,000 peak connections. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | ------ | ----------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx b/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx index 3cbea00db4f..d6a1f8875f8 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx @@ -1,5 +1,5 @@ - per 1 million messages. You are only charged for usage exceeding your subscription -plan's quota. + per 1 million messages. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | --------- | --------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx b/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx index 3d05742e871..5ced3ca7023 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx @@ -1,5 +1,5 @@ - per 1,000 origin images. You are only charged for usage exceeding your subscription -plan's quota. + per 1,000 origin images. You are only charged for usage exceeding your +subscription plan's quota. diff --git a/apps/docs/content/_partials/universal_links_apple.mdx b/apps/docs/content/_partials/universal_links_apple.mdx index ef9ada6753b..a6016206bc0 100644 --- a/apps/docs/content/_partials/universal_links_apple.mdx +++ b/apps/docs/content/_partials/universal_links_apple.mdx @@ -5,7 +5,6 @@ For a better user experience, you can use **Universal Links** instead of custom To enable Universal Links, you need to: 1. **Configure Associated Domains** in your Xcode project: - - Add your domain to the Associated Domains capability - Format: `applinks:yourdomain.com` diff --git a/apps/docs/content/guides/ai/hybrid-search.mdx b/apps/docs/content/guides/ai/hybrid-search.mdx index 8664ee9e32e..69a6fafa9de 100644 --- a/apps/docs/content/guides/ai/hybrid-search.mdx +++ b/apps/docs/content/guides/ai/hybrid-search.mdx @@ -134,13 +134,11 @@ $$; Let's break this down: - **Parameters:** The function accepts quite a few parameters, but the main (required) ones are `query_text`, `query_embedding`, and `match_count`. - - `query_text` is the user's query text (more on this shortly) - `query_embedding` is the vector representation of the user's query produced by the embedding model. We chose 512 dimensions for this example, but adjust this to match the size of the embedding vectors generated from your preferred model. This must match the size of the `embedding` vector on the `documents` table (and use the same model). - `match_count` is the number of records returned in the `limit` clause. The other parameters are optional, but give more control over the fusion process. - - `full_text_weight` and `semantic_weight` decide how much weight each search method gets in the final score. These are both 1 by default which means they both equally contribute towards the final rank. A `full_text_weight` of 2 and `semantic_weight` of 1 would give full-text search twice as much weight as semantic search. - `rrf_k` is the `k` [smoothing constant](#smoothing-constant-k) added to the reciprocal rank. The default is 50. diff --git a/apps/docs/content/guides/auth/general-configuration.mdx b/apps/docs/content/guides/auth/general-configuration.mdx index 9a576119fab..0e79c0625c7 100644 --- a/apps/docs/content/guides/auth/general-configuration.mdx +++ b/apps/docs/content/guides/auth/general-configuration.mdx @@ -25,7 +25,6 @@ Supabase Auth provides these [general configuration options](/dashboard/project/ - **Allow new users to sign up**: Users will be able to sign up. If this config is disabled, only existing users can sign in. - **Confirm Email**: Users will need to confirm their email address before signing in for the first time. - - Having **Confirm Email** disabled assumes that the user's email does not need to be verified in order to login and implicitly confirms the user's email in the database. - This option can be found in the email provider under the provider-specific configuration. {/* - If you previously relied on this config to autoconfirm a user's email address, you can switch to use **Allow unverified email sign in** instead. This new option allows the user to sign in with an unverified email which you can keep track of through the user object. It provides more versatility if you require your users to verify their email address in the future since you can structure your RLS policies to check the user's `email_verified` field. */} diff --git a/apps/docs/content/guides/auth/rate-limits.mdx b/apps/docs/content/guides/auth/rate-limits.mdx index dc543045bdf..3b8a0a4d9a7 100644 --- a/apps/docs/content/guides/auth/rate-limits.mdx +++ b/apps/docs/content/guides/auth/rate-limits.mdx @@ -34,7 +34,7 @@ curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \ ## Rate limit behavior -Supabase Auth uses a token bucket algorithm for endpoint operations that are limited by IP address. +Supabase Auth uses a token bucket algorithm for endpoint operations that are limited by IP address. Each bucket has a maximum capacity of 30 requests. When the bucket is full, brief bursts of up to 30 requests can be allowed in a short period. Once the bucket empties, requests are rate limited until tokens refill. The rate limit defines the rate at which the bucket is refilled. diff --git a/apps/docs/content/guides/auth/social-login/auth-facebook.mdx b/apps/docs/content/guides/auth/social-login/auth-facebook.mdx index 555828dd3a4..fef53130348 100644 --- a/apps/docs/content/guides/auth/social-login/auth-facebook.mdx +++ b/apps/docs/content/guides/auth/social-login/auth-facebook.mdx @@ -357,19 +357,16 @@ Development mode is sufficient for local development and testing. You only need Before your app can be used by the general public, you need to complete Facebook's App Review process: 1. **Complete App Settings**: In your Facebook app's **Settings > Basic**, fill in all required fields including: - - App Icon - Privacy Policy URL - Terms of Service URL (if applicable) - App Domain 2. **Request Permissions**: Navigate to **App Review > Permissions and Features** and request the permissions you need: - - `public_profile` - Usually pre-approved - `email` - Requires verification that your app needs email access 3. **Submit for Review**: Click **Submit for Review** and provide: - - Detailed instructions for how Facebook reviewers should test your login flow - A screencast video demonstrating the Facebook Login feature - Explanation of how user data will be used diff --git a/apps/docs/content/guides/database/import-data.mdx b/apps/docs/content/guides/database/import-data.mdx index df2a6cc0b64..ca2e330b508 100644 --- a/apps/docs/content/guides/database/import-data.mdx +++ b/apps/docs/content/guides/database/import-data.mdx @@ -53,7 +53,6 @@ You can use it in conjunction with Supabase by following these steps: ``` Customize the source and Supabase database URL and options to fit your specific use case: - - `wal_buffers`: This parameter is set to '64MB' to allocate 64 megabytes of memory for write-ahead logging buffers. A larger value can help improve write performance by caching more data in memory before writing it to disk. This can be useful during data import operations to speed up the writing of transaction logs. - `max_wal_senders`: It is set to 0, to disable replication connections. This is done during the data import process to prevent replication-related conflicts and issues. - `statement_timeout`: The value is set to 0, which means it's disabled, allowing SQL statements to run without a time limit. diff --git a/apps/docs/content/guides/database/replication/replication-setup.mdx b/apps/docs/content/guides/database/replication/replication-setup.mdx index 6188318c9f2..659247e2e4c 100644 --- a/apps/docs/content/guides/database/replication/replication-setup.mdx +++ b/apps/docs/content/guides/database/replication/replication-setup.mdx @@ -136,21 +136,18 @@ Before configuring BigQuery as a destination, set up the following in Google Clo 1. **Google Cloud Platform (GCP) account**: [Sign up for GCP](https://cloud.google.com/gcp) if you don't have one 2. **BigQuery dataset**: Create a [BigQuery dataset](https://cloud.google.com/bigquery/docs/datasets-intro) in your GCP project - - Open the BigQuery console in GCP - Select your project - Click "Create Dataset" - Provide a dataset ID (e.g., `supabase_replication`) 3. **GCP service account key**: Create a [service account](https://cloud.google.com/iam/docs/keys-create-delete) with appropriate permissions: - - Go to IAM & Admin → Service Accounts - Click "Create Service Account" - Grant the **BigQuery Data Editor** role - Create and download the JSON key file Required permissions: - - `bigquery.datasets.get` - `bigquery.tables.create` - `bigquery.tables.get` @@ -171,13 +168,11 @@ Before configuring BigQuery as a destination, set up the following in Google Clo /> 3. Configure the general settings: - - **Destination name**: A name to identify this destination (e.g., "BigQuery Warehouse") - **Publication**: The publication to replicate data from (created in [Step 1](#step-1-create-a-postgres-publication)) - **Destination type**: Select **BigQuery** 4. Configure BigQuery-specific settings: - - **Project ID**: Your BigQuery project identifier (found in the GCP Console) - **Dataset ID**: The name of your BigQuery dataset (without the project ID) @@ -190,7 +185,6 @@ Before configuring BigQuery as a destination, set up the following in Google Clo - **Service Account Key**: Your GCP service account key in JSON format (from Step 1) 5. Configure **Advanced Settings** (optional): - - **Batch wait time (milliseconds)**: How long to wait for more changes before sending a batch. Default is recommended for optimal performance. 6. Click **Create and start** to begin replication diff --git a/apps/docs/content/guides/deployment/going-into-prod.mdx b/apps/docs/content/guides/deployment/going-into-prod.mdx index 1b23ede39a9..a44b3d0cc56 100644 --- a/apps/docs/content/guides/deployment/going-into-prod.mdx +++ b/apps/docs/content/guides/deployment/going-into-prod.mdx @@ -107,13 +107,11 @@ Stay informed about Supabase service status by subscribing to the [Status Page]( ### Setting up Slack notifications 1. Install the RSS app in Slack: - - Visit the [RSS app page](https://slack.com/marketplace/A0F81R7U7-rss) in the Slack marketplace - Click `Add to Slack` if not already installed - Otherwise you will get straight to next step, no need to reinstall the app 2. Configure the Supabase status feed: - - Create a channel (e.g., `#supabase-status-alerts`) for status updates - On the [RSS app page](https://slack.com/marketplace/A0F81R7U7-rss) go to _Add a Feed_ section and set Feed URL to `https://status.supabase.com/history.rss` - Select your designated channel and click "Subscribe to this feed" diff --git a/apps/docs/content/guides/functions/architecture.mdx b/apps/docs/content/guides/functions/architecture.mdx index d074e55b864..5bb5eb07f08 100644 --- a/apps/docs/content/guides/functions/architecture.mdx +++ b/apps/docs/content/guides/functions/architecture.mdx @@ -13,7 +13,6 @@ This guide explains the architecture and inner workings of Supabase Edge Functio To illustrate how edge functions operate, consider a photo-sharing app where users upload images and apply filters (e.g., grayscale or sepia) before saving them. - **Workflow Overview**: - - A user uploads an original image to Supabase Storage. - When the user selects a filter, the client-side app (using the Supabase JavaScript SDK) invokes an edge function named something like "apply-filter." - The edge function: @@ -34,7 +33,6 @@ This example highlights edge functions as lightweight, on-demand code snippets t Deploying an edge function is straightforward and automated, requiring no manual server setup. - **Steps to Deploy**: - 1. Write the function code in your local Supabase project (e.g., in `supabase/functions/apply-filter/index.ts`). 2. Run the command `supabase functions deploy apply-filter` via the Supabase CLI. 3. The CLI bundles the function and its dependencies into an **ESZip file**—a compact format created by Deno that includes a complete module graph for quick loading and execution. @@ -52,7 +50,6 @@ Once deployed, the function is ready for invocation from anywhere, with Supabase Edge functions leverage a distributed architecture to minimize latency by running code close to the user. - **Architecture Components**: - - **Global API Gateway**: Acts as the entry point for all requests. It uses the requester's IP address to determine geographic location and routes the request to the nearest edge location (e.g., routing a request from Amsterdam to Frankfurt). - **Edge Locations**: Supabase's network of data centers worldwide where functions are replicated. The ESZip bundle is automatically distributed to these locations upon deployment. - **Routing Logic**: Based on geolocation mapping, ensuring the function executes as close as possible to the user for optimal performance. @@ -68,20 +65,17 @@ This global edge network is what makes edge functions "edge-native," providing c The core of edge functions' efficiency lies in their execution environment, which prioritizes speed, isolation, and scalability. - **Request Handling**: - 1. A client sends an HTTP request (e.g., POST) to the function's URL, including parameters like auth headers, image ID, and filter type. 2. The global API gateway routes it to the nearest edge location. 3. At the edge, Supabase's **edge runtime** validates the request (e.g., checks authorization). - **Execution Environment**: - - A new **V8 isolate** is spun up for each invocation. V8 is the JavaScript engine used by Chrome and Node.js, providing a lightweight, sandboxed environment. - Each isolate has its own memory heap and execution thread, ensuring complete isolation—no interference between concurrent requests. - The ESZip bundle is loaded into the isolate, and the function code runs. - After execution, the response (e.g., filtered image path) is sent back to the client. - **Performance Optimizations**: - - **Cold Starts**: Even initial executions are fast (milliseconds) due to the compact ESZip format and minimal Deno runtime overhead. - **Warm Starts**: Isolates can remain active for a period (plan-dependent) to handle subsequent requests without restarting. - **Concurrency**: Multiple isolates can run simultaneously in the same edge location, supporting high traffic. @@ -95,7 +89,6 @@ Compared to traditional serverless or monolithic architectures, this setup offer ## Benefits and use cases - **Advantages**: - - **Low Latency**: Proximity to users reduces round-trip times. - **Scalability**: Handles variable loads without provisioning servers. - **Developer-Friendly**: Focus on code; Supabase manages the rest. diff --git a/apps/docs/content/guides/functions/examples/og-image.mdx b/apps/docs/content/guides/functions/examples/og-image.mdx index e47bc9fcec0..ec076c16b7c 100644 --- a/apps/docs/content/guides/functions/examples/og-image.mdx +++ b/apps/docs/content/guides/functions/examples/og-image.mdx @@ -26,21 +26,19 @@ import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts' export default function handler(req: Request) { return new ImageResponse( - ( -
- Hello OG Image! -
- ) +
+ Hello OG Image! +
) } ``` diff --git a/apps/docs/content/guides/local-development/testing/overview.mdx b/apps/docs/content/guides/local-development/testing/overview.mdx index eb212ec063e..1b17a3cfae3 100644 --- a/apps/docs/content/guides/local-development/testing/overview.mdx +++ b/apps/docs/content/guides/local-development/testing/overview.mdx @@ -281,13 +281,11 @@ jobs: ## Best practices 1. **Test Data Setup** - - Use begin and rollback to ensure test isolation - Create realistic test data that covers edge cases - Use different user roles and permissions in tests 2. **RLS Policy Testing** - - Test Create, Read, Update, Delete operations - Test with different user roles: anonymous and authenticated - Test edge cases and potential security bypasses @@ -310,7 +308,6 @@ For more complex, real-world examples of database testing, check out: Common issues and solutions: 1. **Test Failures Due to RLS** - - Ensure you've set the correct role `set local role authenticated;` - Verify JWT claims are set `set local "request.jwt.claims"` - Check policy definitions match your test assumptions diff --git a/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx b/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx index 1e4fbf57411..ac6e42168de 100644 --- a/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx +++ b/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx @@ -67,13 +67,11 @@ create extension if not exists "basejump-supabase_test_helpers" version '0.0.6'; The test helpers package provides several advantages over writing raw pgTAP tests: 1. **Simplified User Management** - - Create test users with `tests.create_supabase_user()` - Switch contexts with `tests.authenticate_as()` - Retrieve user IDs using `tests.get_supabase_uid()` 2. **Row Level Security (RLS) Testing Utilities** - - Verify RLS status with `tests.rls_enabled()` - Test policy enforcement - Simulate different user contexts @@ -262,7 +260,6 @@ This demo app implements: ### What makes this complex? 1. **Layered Permissions** - - Role hierarchies affect access rights - Plan types influence user capabilities - Content state (draft/published) affects permissions diff --git a/apps/docs/content/guides/platform/access-control.mdx b/apps/docs/content/guides/platform/access-control.mdx index fdb8f357949..5a8dca998dd 100644 --- a/apps/docs/content/guides/platform/access-control.mdx +++ b/apps/docs/content/guides/platform/access-control.mdx @@ -269,9 +269,15 @@ The table below shows the actions each role can take on the resources belonging | | Delete | | | | | [^1]: Available on the Team and Enterprise Plans. + [^2]: Sending anonymous data to OpenAI is opt in and can improve Studio AI Assistant's responses. + [^3]: Invites sent from a SSO account can only be accepted by another SSO account coming from the same identity provider. This is a security measure that prevents accidental invites to accounts not managed by your company's enterprise systems. + [^4]: Available on the Team and Enterprise Plans. + [^5]: Read-Only role is able to access secrets. + [^6]: Listed permissions are for the API and Dashboard. + [^7]: Limited to executing SELECT queries. SQL Query Snippets run by the Read-Only role are run against the database using the **supabase_read_only_user**. This role has the [predefined Postgres role pg_read_all_data](https://www.postgresql.org/docs/current/predefined-roles.html). diff --git a/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx b/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx index 858aa8081b5..30b23d54033 100644 --- a/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx +++ b/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx @@ -67,6 +67,7 @@ src="/docs/img/guides/platform/aws-marketplace-listing-subscribe.png" width={2270} height={632} /> + @@ -79,6 +80,7 @@ src="/docs/img/guides/platform/aws-marketplace-listing-success.png" width={1944} height={1254} /> + @@ -94,6 +96,7 @@ src={{ width={3048} height={1058} /> + diff --git a/apps/docs/content/guides/platform/compute-and-disk.mdx b/apps/docs/content/guides/platform/compute-and-disk.mdx index b0c5d466c40..caa6fc6a91e 100644 --- a/apps/docs/content/guides/platform/compute-and-disk.mdx +++ b/apps/docs/content/guides/platform/compute-and-disk.mdx @@ -32,7 +32,9 @@ In paid organizations, Nano Compute are billed at the same price as Micro Comput | >16XL | - | [Contact Us](/dashboard/support/new?category=sales&subject=Enquiry%20about%20larger%20instance%20sizes) | Custom | Custom | Custom | [^1]: Database max connections are recommended values and can be [customized via `max_connections`](/docs/guides/database/custom-postgres-config) depending on your use case. Be aware of [these considerations](/docs/guides/troubleshooting/how-to-change-max-database-connections-_BQ8P5) before modifying. + [^2]: Database size for each compute instance is the default recommendation but the actual performance of your database has many contributing factors, including resources available to it and the size of the data contained within it. See the [shared responsibility model](/docs/guides/platform/shared-responsibility-model) for more information. + [^3]: Compute resources on the Free plan are subject to change. Compute sizes can be changed by first selecting your project in the dashboard [here](/dashboard/project/_/settings/compute-and-disk) and the upgrade process will [incur downtime](/docs/guides/platform/compute-and-disk#upgrades). diff --git a/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx b/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx index 7ba4fc78a28..5bd2ffc10ce 100644 --- a/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx +++ b/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx @@ -112,7 +112,6 @@ Migrate existing users to Supabase Auth. This requires two main steps: first, ch 1. To sign in your migrated users, use the Supabase Auth [sign in methods](/docs/reference/javascript/auth-signinwithpassword). To check for edge cases where users aren't successfully migrated, use a fallback strategy. This ensures that users can continue to sign in seamlessly: - 1. Try to sign in the user with Supabase Auth. 1. If the signin fails, try to sign in with Auth0. 1. If Auth0 signin succeeds, call the admin create user method again to create the user in Supabase Auth. diff --git a/apps/docs/content/guides/platform/read-replicas/getting-started.mdx b/apps/docs/content/guides/platform/read-replicas/getting-started.mdx index 33e0193ff84..34dc491e36b 100644 --- a/apps/docs/content/guides/platform/read-replicas/getting-started.mdx +++ b/apps/docs/content/guides/platform/read-replicas/getting-started.mdx @@ -16,15 +16,12 @@ Projects must meet these requirements to use Read Replicas: 1. Running on AWS. 2. Running on at least a [Small compute add-on](/docs/guides/platform/compute-add-ons). - - Read Replicas are started on the same compute instance as the Primary to keep up with changes. 3. Running on Postgres 15+. - - For projects running on older versions of Postgres, you need to [upgrade to the latest platform version](/docs/guides/platform/migrating-and-upgrading-projects#pgupgrade). 4. Not using [legacy logical backups](/docs/guides/platform/backups#point-in-time-recovery) - - Physical backups are automatically enabled if using [Point in time recovery (PITR)](/docs/guides/platform/backups#point-in-time-recovery) ## Creating a Read Replica diff --git a/apps/docs/content/guides/queues.mdx b/apps/docs/content/guides/queues.mdx index 8130a357edc..2d69042c249 100644 --- a/apps/docs/content/guides/queues.mdx +++ b/apps/docs/content/guides/queues.mdx @@ -19,10 +19,12 @@ Queues couples the reliability of Postgres with the simplicity Supabase's platfo
A Message is delivered exactly once to a consumer within a customizable visibility window. - **Message Durability and Archival**
- Messages are stored in Postgres and you can choose to archive them for analytical or auditing purposes. + Messages are stored in Postgres and you can choose to archive them for analytical or auditing + purposes. - **Granular Authorization**
- Control client-side consumer access to Queues with API permissions and Row Level Security (RLS) policies. + Control client-side consumer access to Queues with API permissions and Row Level Security (RLS) + policies. - **Queue Management and Monitoring**
Create, manage, and monitor Queues and Messages in the Supabase Dashboard. diff --git a/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx b/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx index 955c0b00022..1cbdd4d4199 100644 --- a/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx +++ b/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx @@ -100,15 +100,15 @@ This should return the EC public key (the symmetric key is excluded). Third-part New variables default to empty values in `.env.example`. When empty, the API gateway and all services operate in legacy-only mode: `sb_publishable` and `sb_secret` API keys are not configured. -| Environment variable (existing and new) | Type | Description | -|---|---|---| -| `JWT_SECRET` | Symmetric secret | **Existing:** Shared secret for signing and verifying HS256 JWTs. Used by multiple services. | -| `ANON_KEY` | HS256 JWT | **Existing:** Legacy client-side API key. Embedded JWT with `role: "anon"`. | -| `SERVICE_ROLE_KEY` | HS256 JWT | **Existing:** Legacy server-side API key. Embedded JWT with `role: "service_role"`. | -| `SUPABASE_PUBLISHABLE_KEY` | Opaque | **New:** Short random key with checksum. Replaces `ANON_KEY` for **client-side** use. | -| `SUPABASE_SECRET_KEY` | Opaque | **New:** Short random key with checksum. Replaces `SERVICE_ROLE_KEY` for **server-side** use. | -| `JWT_KEYS` | JSON array | **New:** JSON array of signing JWKs containing the new asymmetric key pair and the legacy symmetric key. Used by Auth to sign tokens. | -| `JWT_JWKS` | JWKS (JSON) | **New:** Contains the new public key and the legacy symmetric key. Used by PostgREST, Realtime, and Storage to verify tokens. | +| Environment variable (existing and new) | Type | Description | +| --------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `JWT_SECRET` | Symmetric secret | **Existing:** Shared secret for signing and verifying HS256 JWTs. Used by multiple services. | +| `ANON_KEY` | HS256 JWT | **Existing:** Legacy client-side API key. Embedded JWT with `role: "anon"`. | +| `SERVICE_ROLE_KEY` | HS256 JWT | **Existing:** Legacy server-side API key. Embedded JWT with `role: "service_role"`. | +| `SUPABASE_PUBLISHABLE_KEY` | Opaque | **New:** Short random key with checksum. Replaces `ANON_KEY` for **client-side** use. | +| `SUPABASE_SECRET_KEY` | Opaque | **New:** Short random key with checksum. Replaces `SERVICE_ROLE_KEY` for **server-side** use. | +| `JWT_KEYS` | JSON array | **New:** JSON array of signing JWKs containing the new asymmetric key pair and the legacy symmetric key. Used by Auth to sign tokens. | +| `JWT_JWKS` | JWKS (JSON) | **New:** Contains the new public key and the legacy symmetric key. Used by PostgREST, Realtime, and Storage to verify tokens. | ### Differences from the Supabase platform @@ -186,7 +186,6 @@ For **Realtime WebSocket** connections, the API key is sent as a `?apikey=` quer **Storage** and **Edge Functions** accept requests without an API key. These services handle their own authentication. - ### API gateway routing Kong is configured with two consumers that each accept both the legacy and new API keys: @@ -195,27 +194,27 @@ Kong is configured with two consumers that each accept both the legacy and new A consumers: - username: anon keyauth_credentials: - - key: $SUPABASE_ANON_KEY # legacy HS256 JWT (ANON_KEY) - - key: $SUPABASE_PUBLISHABLE_KEY # new opaque key (omitted when not configured) + - key: $SUPABASE_ANON_KEY # legacy HS256 JWT (ANON_KEY) + - key: $SUPABASE_PUBLISHABLE_KEY # new opaque key (omitted when not configured) - username: service_role keyauth_credentials: - - key: $SUPABASE_SERVICE_KEY # legacy HS256 JWT (SERVICE_ROLE_KEY) - - key: $SUPABASE_SECRET_KEY # new opaque key (omitted when not configured) + - key: $SUPABASE_SERVICE_KEY # legacy HS256 JWT (SERVICE_ROLE_KEY) + - key: $SUPABASE_SECRET_KEY # new opaque key (omitted when not configured) ``` When new API keys have not been added yet, the `kong-entrypoint.sh` script removes the empty credential entries before Kong loads the config. To assist with the authorization flows a specialized configuration in `kong.yml` substitutes internal, gateway-level-only pre-signed JWTs for `sb_publishable` and `sb_secret` API keys. These pre-signed JWTs are also auto-configured in `.env` but **should not** be used in any application code. -| Route | Service | API key required | Header substitution | -|---|---|---|---| -| `/auth/v1/*` | Auth | Yes | `Authorization` | -| `/rest/v1/*` | PostgREST | Yes | `Authorization` | -| `/graphql/v1` | PostgREST | Yes | `Authorization` | -| `/realtime/v1/api/*` | Realtime (REST) | Yes | `Authorization` | -| `/realtime/v1/*` | Realtime (WebSocket) | Yes | `x-api-key` | -| `/storage/v1/*` | Storage | No | `Authorization` | -| `/functions/v1/*` | Edge Functions | No | - | +| Route | Service | API key required | Header substitution | +| -------------------- | -------------------- | ---------------- | ------------------- | +| `/auth/v1/*` | Auth | Yes | `Authorization` | +| `/rest/v1/*` | PostgREST | Yes | `Authorization` | +| `/graphql/v1` | PostgREST | Yes | `Authorization` | +| `/realtime/v1/api/*` | Realtime (REST) | Yes | `Authorization` | +| `/realtime/v1/*` | Realtime (WebSocket) | Yes | `x-api-key` | +| `/storage/v1/*` | Storage | No | `Authorization` | +| `/functions/v1/*` | Edge Functions | No | - | ### Request flows diff --git a/apps/docs/content/guides/storage/s3/compatibility.mdx b/apps/docs/content/guides/storage/s3/compatibility.mdx index 1e69c541a76..9127228a05e 100644 --- a/apps/docs/content/guides/storage/s3/compatibility.mdx +++ b/apps/docs/content/guides/storage/s3/compatibility.mdx @@ -55,7 +55,7 @@ The most commonly used endpoints are implemented, and more will be added. Implem | ✅ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) | System Metadata:
✅ Content-Type
✅ Cache-Control
✅ Content-Disposition
✅ Content-Encoding
✅ Content-Language
✅ Expires
❌ Content-MD5
❌ Object Lifecycle
❌ Website:
❌ x-amz-website-redirect-location
❌ SSE-C:
❌ x-amz-server-side-encryption
❌ x-amz-server-side-encryption-customer-algorithm
❌ x-amz-server-side-encryption-customer-key
❌ x-amz-server-side-encryption-customer-key-MD5
❌ x-amz-server-side-encryption-aws-kms-key-id
❌ x-amz-server-side-encryption-context
❌ x-amz-server-side-encryption-bucket-key-enabled
❌ Request Payer:
❌ x-amz-request-payer
❌ Tagging:
❌ x-amz-tagging
❌ Object Locking:
❌ x-amz-object-lock-mode
❌ x-amz-object-lock-retain-until-date
❌ x-amz-object-lock-legal-hold
❌ ACL:
❌ x-amz-acl
❌ x-amz-grant-full-control
❌ x-amz-grant-read
❌ x-amz-grant-read-acp
❌ x-amz-grant-write-acp
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) | ❌ Multi-factor authentication:
❌ x-amz-mfa
❌ Object Locking:
❌ x-amz-bypass-governance-retention
❌ Request Payer:
❌ x-amz-request-payer
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) | ❌ Multi-factor authentication:
❌ x-amz-mfa
❌ Object Locking:
❌ x-amz-bypass-governance-retention
❌ Request Payer:
❌ x-amz-request-payer
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | -| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | ✅ Query Parameters:
✅ delimiter
✅ encoding-type
✅ key-marker
✅️ max-uploads
✅ prefix
✅ upload-id-marker | +| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | ✅ Query Parameters:
✅ delimiter
✅ encoding-type
✅ key-marker
✅️ max-uploads
✅ prefix
✅ upload-id-marker | | ✅ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | ✅ System Metadata:
✅ Content-Type
✅ Cache-Control
✅ Content-Disposition
✅ Content-Encoding
✅ Content-Language
✅ Expires
❌ Content-MD5
❌ Website:
❌ x-amz-website-redirect-location
❌ SSE-C:
❌ x-amz-server-side-encryption
❌ x-amz-server-side-encryption-customer-algorithm
❌ x-amz-server-side-encryption-customer-key
❌ x-amz-server-side-encryption-customer-key-MD5
❌ x-amz-server-side-encryption-aws-kms-key-id
❌ x-amz-server-side-encryption-context
❌ x-amz-server-side-encryption-bucket-key-enabled
❌ Request Payer:
❌ x-amz-request-payer
❌ Tagging:
❌ x-amz-tagging
❌ Object Locking:
❌ x-amz-object-lock-mode
❌ x-amz-object-lock-retain-until-date
❌ x-amz-object-lock-legal-hold
❌ ACL:
❌ x-amz-acl
❌ x-amz-grant-full-control
❌ x-amz-grant-read
❌ x-amz-grant-read-acp
❌ x-amz-grant-write-acp
❌ Storage class:
❌ x-amz-storage-class
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | ❌ Bucket Owner:
❌ x-amz-expected-bucket-owner
❌ Request Payer:
❌ x-amz-request-payer | | ✅ [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | ❌ Request Payer:
❌ x-amz-request-payer | diff --git a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx index 43a460c9e17..43c59abaa73 100644 --- a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx +++ b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx @@ -43,7 +43,6 @@ This situation often arises in large, high-write tables (e.g., `your_table`, whi Since the wraparound prevention autovacuum cannot be stopped, the best approach is to provide the database with sufficient resources to complete the operation as quickly and efficiently as possible. 1. **Upgrade your Database Compute Instance:** - - **Action:** Temporarily scale up your instance's CPU (e.g., from `m6g.4xlarge` to `m6g.8xlarge` or higher). - **Why it helps:** More CPU cores and processing power will help the autovacuum operation run faster, reducing the overall time it impacts your database. - **Considerations:** This usually causes a brief downtime (typically 1-2 minutes) as the instance restarts. However, the autovacuum process is designed to pause and resume automatically. diff --git a/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx b/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx index 90e8989f2a2..5265d41de50 100644 --- a/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx +++ b/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx @@ -24,17 +24,14 @@ This method requires two steps - first delete in Supabase, then clean up in Verc 2. **Clean up in Vercel** After deleting from Supabase, clean up in Vercel: - - Navigate to your [Vercel dashboard](https://vercel.com/dashboard) - Go to the **Storage** tab - Click on the Supabase project (it will show as "uninstalled") ![Uninstalled Supabase project in Vercel Storage](/docs/img/troubleshooting/cf450bca-aad3-4783-ae3b-5cc83e0afa54.png) - - Scroll down and find the **Settings** tab in the sidebar ![Vercel project settings navigation](/docs/img/troubleshooting/da70bc33-f123-4567-8901-abcdef123456.png) - - Click **Delete Database** to completely remove it ![Delete Database button in Vercel settings](/docs/img/troubleshooting/c4e7b193-4567-8901-abcd-ef1234567890.png) @@ -84,7 +81,6 @@ If you want to move a Vercel-linked project to a different organization: 2. **Clean up in Vercel** After transferring, the project will show as "uninstalled" in Vercel but still appear under Storage. You need to manually delete it: - - Navigate to your [Vercel dashboard](https://vercel.com/dashboard) - Go to the **Storage** tab - Click on the Supabase project (it will show as "uninstalled") diff --git a/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx b/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx index 4aad6fcfb37..fdd60cd2fbd 100644 --- a/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx +++ b/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx @@ -32,7 +32,6 @@ The email templating system often uses a language like Go, which has built-in se You may observe two distinct issues: 1. **The `#ZgotmplZ` Error**: - - **Cause**: This error occurs when you attempt to use a non-standard URL scheme (like `your-app-scheme://` for a mobile app deep link) directly within a template variable like `{{ .SiteURL }}` in your email templates. Go's security features sanitize this perceived "unsafe" URL, replacing it with the `#ZgotmplZ` placeholder. This prevents the link from being rendered correctly and thus from working. 2. **The 'Cannot Parse Response' Error**: diff --git a/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx b/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx index 8644c9f4650..dc2eddd2bb7 100644 --- a/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx +++ b/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx @@ -37,7 +37,6 @@ In most cases, quota overages are accidental rather than intentional: ## What to do if your project is suspended 1. **Open a support ticket**: [Contact support](/dashboard/support/new) and include: - - Your project reference ID - A description of your Realtime use case (what features use Broadcast, Presence, or Postgres Changes) - An estimate of your expected concurrent connections and message throughput diff --git a/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx b/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx index 2bb26125c04..61b57decaf4 100644 --- a/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx +++ b/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx @@ -13,12 +13,10 @@ This typically indicates an authentication failure where the database connection **To resolve this, consider one of the following solutions:** 1. **Check Network Bans:** - - Navigate to your project's [Database Settings](/dashboard/project/_/database/settings) page. - Review any listed IP addresses that are blocked. Remove any entries that correspond to your current connection and then try the CLI action again. 2. **Use the old Password-Based authentication flow instead:** - - Provide your database password directly through an environment variable when running the CLI command. ```bash @@ -26,7 +24,6 @@ This typically indicates an authentication failure where the database connection ``` 3. **Skip the Pooler and connect directly to the database with the Supabase CLI (Requires IPv6):** - - If your network supports IPv6, you can use the beta CLI version with the `--skip-pooler` flag to bypass the connection pooler to avoid this particular issue. ```bash diff --git a/apps/docs/docs/ref/csharp/v0/release-notes.mdx b/apps/docs/docs/ref/csharp/v0/release-notes.mdx index 2ce380a99fc..df2d78c8fdf 100644 --- a/apps/docs/docs/ref/csharp/v0/release-notes.mdx +++ b/apps/docs/docs/ref/csharp/v0/release-notes.mdx @@ -265,7 +265,6 @@ Thanks [@wiverson](https://github.com/wiverson) for the work in this release! ## 0.9.0 - 2023-04-12 - Update dependency: gotrue-csharp@3.1.0 - - [Minor] Implements PKCE auth flow. SignIn using a provider now returns an instance of `ProviderAuthState` rather than a `string`. diff --git a/apps/docs/features/docs/Reference.introduction.tsx b/apps/docs/features/docs/Reference.introduction.tsx index f799668bfe3..5ccb90e47c3 100644 --- a/apps/docs/features/docs/Reference.introduction.tsx +++ b/apps/docs/features/docs/Reference.introduction.tsx @@ -10,13 +10,13 @@ import commonClientLibSections from '~/spec/common-client-libs-sections.json' wi function hasIntro(sections: typeof commonClientLibSections, excludeName?: string) { return Boolean( sections[0]?.type === 'markdown' && - sections[0]?.slug === 'introduction' && - (!excludeName || - !( - 'excludes' in sections[0] && - Array.isArray(sections[0].excludes) && - sections[0].excludes?.includes(excludeName) - )) + sections[0]?.slug === 'introduction' && + (!excludeName || + !( + 'excludes' in sections[0] && + Array.isArray(sections[0].excludes) && + sections[0].excludes?.includes(excludeName) + )) ) } diff --git a/apps/docs/features/docs/Reference.ui.tsx b/apps/docs/features/docs/Reference.ui.tsx index f9d13bef8a2..30721abeaab 100644 --- a/apps/docs/features/docs/Reference.ui.tsx +++ b/apps/docs/features/docs/Reference.ui.tsx @@ -200,7 +200,7 @@ function ParamOrTypeDetails({ paramOrType }: { paramOrType: object }) { 'description' in paramOrType ? (paramOrType.description as string) : isFromTypespec(paramOrType) - ? paramOrType.comment?.shortText ?? '' + ? (paramOrType.comment?.shortText ?? '') : '' const subContent = diff --git a/apps/docs/layouts/MainSkeleton.tsx b/apps/docs/layouts/MainSkeleton.tsx index a2f0bf178e8..6f899c66cfb 100644 --- a/apps/docs/layouts/MainSkeleton.tsx +++ b/apps/docs/layouts/MainSkeleton.tsx @@ -236,7 +236,7 @@ const MobileHeader = memo(function MobileHeader(props: MobileHeaderProps) { {mobileMenuOpen ? 'Close' : 'menuId' in props - ? levelsData[props.menuId]?.name ?? levelsData['home'].name + ? (levelsData[props.menuId]?.name ?? levelsData['home'].name) : props.menuName} diff --git a/apps/learn/components/side-navigation-item.tsx b/apps/learn/components/side-navigation-item.tsx index 619f4ae6bb1..a652774dd06 100644 --- a/apps/learn/components/side-navigation-item.tsx +++ b/apps/learn/components/side-navigation-item.tsx @@ -14,8 +14,7 @@ import { Badge, cn } from 'ui' // 2. AnchorHTMLAttributes - for standard HTML anchor props (className, etc) // We omit href from both since we compute it internally from item.href interface NavigationItemProps - extends Omit, - Omit, 'href'> { + extends Omit, Omit, 'href'> { item: SidebarNavItem onClick?: (e: React.MouseEvent) => void level?: number diff --git a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx index 129cf6440be..445e55e1af7 100644 --- a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx @@ -18,8 +18,10 @@ import { TimestampInfo, timestampLocalFormatter } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { BlockKeys } from '../common/BlockKeys' -interface BaseEditorProps - extends RenderEditCellProps { +interface BaseEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { type: 'date' | 'datetime' | 'datetimetz' isNullable: boolean } diff --git a/apps/studio/components/grid/components/editor/JsonEditor.tsx b/apps/studio/components/grid/components/editor/JsonEditor.tsx index 4922d306c7a..bc30143a74d 100644 --- a/apps/studio/components/grid/components/editor/JsonEditor.tsx +++ b/apps/studio/components/grid/components/editor/JsonEditor.tsx @@ -25,8 +25,10 @@ const verifyJSON = (value: string) => { } } -interface JsonEditorProps - extends RenderEditCellProps { +interface JsonEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { isEditable: boolean onExpandEditor: (column: string, row: TRow) => void } diff --git a/apps/studio/components/grid/components/editor/SelectEditor.tsx b/apps/studio/components/grid/components/editor/SelectEditor.tsx index f2922a4e5c5..f217efa7383 100644 --- a/apps/studio/components/grid/components/editor/SelectEditor.tsx +++ b/apps/studio/components/grid/components/editor/SelectEditor.tsx @@ -1,8 +1,10 @@ import type { RenderEditCellProps } from 'react-data-grid' import { Select } from 'ui' -interface SelectEditorProps - extends RenderEditCellProps { +interface SelectEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { isNullable?: boolean options: { label: string; _value: string }[] } diff --git a/apps/studio/components/grid/components/editor/TimeEditor.tsx b/apps/studio/components/grid/components/editor/TimeEditor.tsx index ca89fb895d8..a6e863d7d47 100644 --- a/apps/studio/components/grid/components/editor/TimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/TimeEditor.tsx @@ -10,8 +10,10 @@ function autoFocusAndSelect(input: HTMLInputElement | null) { input?.select() } -interface TimeEditorProps - extends RenderEditCellProps { +interface TimeEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { format: string } diff --git a/apps/studio/components/grid/utils/queueOperationUtils.ts b/apps/studio/components/grid/utils/queueOperationUtils.ts index 02dc378e8cc..d9a0ffe401d 100644 --- a/apps/studio/components/grid/utils/queueOperationUtils.ts +++ b/apps/studio/components/grid/utils/queueOperationUtils.ts @@ -12,8 +12,10 @@ import { QueuedOperationType, } from '@/state/table-editor-operation-queue.types' -interface EditCellKeyOperation - extends Omit { +interface EditCellKeyOperation extends Omit< + EditCellContentOperation, + 'payload' | 'id' | 'timestamp' +> { type: QueuedOperationType.EDIT_CELL_CONTENT tableId: number payload: { diff --git a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx index e65f1d37d94..2e7e5a1d7e0 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx @@ -235,8 +235,8 @@ export function StorageSearchResults({ query }: StorageSearchResultsProps) { const totalBucketsEstimate = useMemo(() => { const fileBucketCount = fileBucketsEstimate ?? 0 - const analyticsBucketCount = isAnalyticsBucketsEnabled ? analyticsBuckets?.length ?? 0 : 0 - const vectorBucketCount = isVectorBucketsEnabled ? vectorBuckets?.length ?? 0 : 0 + const analyticsBucketCount = isAnalyticsBucketsEnabled ? (analyticsBuckets?.length ?? 0) : 0 + const vectorBucketCount = isVectorBucketsEnabled ? (vectorBuckets?.length ?? 0) : 0 return fileBucketCount + analyticsBucketCount + vectorBucketCount }, [ diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx index 74fda3915a0..a7672b64b28 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx @@ -130,7 +130,7 @@ export const FeaturePreviewModal = () => { >
- {flags[selectedFeature.key] ?? false ? ( + {(flags[selectedFeature.key] ?? false) ? ( ) : ( diff --git a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx index 4a7ae5ca50a..ac0177f63ca 100644 --- a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx +++ b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx @@ -47,13 +47,13 @@ export function UpdateBillingAddressModal() { const shouldShow = Boolean( IS_PLATFORM && - showMissingAddressModal && - org && - org.plan.id !== 'free' && - org.organization_missing_address && - !org.billing_partner && - permissionsLoaded && - canBillingWrite + showMissingAddressModal && + org && + org.plan.id !== 'free' && + org.organization_missing_address && + !org.billing_partner && + permissionsLoaded && + canBillingWrite ) const { diff --git a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx index f2b3365e2eb..bc0399d6d17 100644 --- a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx @@ -155,7 +155,7 @@ export const PerformanceSettingsForm = () => { if (!isUpdatingDatabaseForm) { databaseForm.reset({ DB_MAX_POOL_SIZE: - authConfig?.DB_MAX_POOL_SIZE !== null ? authConfig?.DB_MAX_POOL_SIZE ?? 10 : 10, + authConfig?.DB_MAX_POOL_SIZE !== null ? (authConfig?.DB_MAX_POOL_SIZE ?? 10) : 10, DB_MAX_POOL_SIZE_UNIT: authConfig?.DB_MAX_POOL_SIZE_UNIT !== null ? authConfig?.DB_MAX_POOL_SIZE_UNIT diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx index 511257ab827..13e51d0116b 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx @@ -197,7 +197,7 @@ export const PolicyEditorPanel = memo(function ({ command, roles: roles.length === 0 ? 'public' : roles, using: using ?? '', - check: command === 'insert' ? using ?? '' : check ?? '', + check: command === 'insert' ? (using ?? '') : (check ?? ''), }) setError(undefined) diff --git a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx index 1a576248d7f..25b50eeefe1 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx @@ -230,7 +230,7 @@ export const UserOverview = ({ user, onDeleteSuccess }: UserOverviewProps) => { const providerName = provider.name === 'email' ? provider.name.toLowerCase() - : providerMeta?.title ?? provider.name + : (providerMeta?.title ?? provider.name) const isActive = data?.[enabledProperty as keyof typeof data] ?? false return ( diff --git a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx index 63f703d7325..df5da8a97f4 100644 --- a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx +++ b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx @@ -224,7 +224,7 @@ export const DatabaseConnectionString = () => { connectionInfo, poolingInfo: { connectionString: sharedPoolerConfig?.connection_string ?? '', - db_host: isReplicaSelected ? connectionInfo.db_host : sharedPoolerConfig?.db_host ?? '', + db_host: isReplicaSelected ? connectionInfo.db_host : (sharedPoolerConfig?.db_host ?? ''), db_name: sharedPoolerConfig?.db_name ?? '', db_port: sharedPoolerConfig?.db_port ?? 0, db_user: sharedPoolerConfig?.db_user ?? '', @@ -236,11 +236,11 @@ export const DatabaseConnectionString = () => { connectionInfo, poolingInfo: { connectionString: isReplicaSelected - ? poolingConfiguration?.connection_string.replace( + ? (poolingConfiguration?.connection_string.replace( poolingConfiguration?.db_host, connectionInfo.db_host - ) ?? '' - : poolingConfiguration?.connection_string ?? '', + ) ?? '') + : (poolingConfiguration?.connection_string ?? ''), db_host: isReplicaSelected ? connectionInfo.db_host : poolingConfiguration?.db_host, db_name: poolingConfiguration?.db_name ?? '', db_port: poolingConfiguration?.db_port ?? 0, @@ -469,7 +469,7 @@ export const DatabaseConnectionString = () => { ...CONNECTION_PARAMETERS.host, value: isReplicaSelected ? connectionInfo.db_host - : poolingConfiguration?.db_host ?? '', + : (poolingConfiguration?.db_host ?? ''), }, { ...CONNECTION_PARAMETERS.port, diff --git a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts index 1843c93595f..7396d28ba29 100644 --- a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts +++ b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts @@ -9,7 +9,7 @@ export function useMcpUrl( projectKeys: StepContentProps['projectKeys'] ): string { const readonly = Boolean(state.mcpReadonly) - const baseUrl = IS_PLATFORM ? 'https://mcp.supabase.com' : projectKeys.apiUrl ?? '' + const baseUrl = IS_PLATFORM ? 'https://mcp.supabase.com' : (projectKeys.apiUrl ?? '') return useMemo(() => { const params = new URLSearchParams() diff --git a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx index 56a7e863902..1dcff8f5b3a 100644 --- a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx @@ -39,7 +39,7 @@ export const ExtensionRow = ({ extension }: ExtensionRowProps) => { const extensionMeta = extensions.find((item) => item.name === extension.name) const docsUrl = extensionMeta?.link.startsWith('/guides') ? `${DOCS_URL}${extensionMeta?.link}` - : extensionMeta?.link ?? undefined + : (extensionMeta?.link ?? undefined) const { mutate: disableExtension, isPending: isDisabling } = useDatabaseExtensionDisableMutation({ onSuccess: () => { diff --git a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx index f4dfd26a69e..0a11a6573e1 100644 --- a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx @@ -36,7 +36,7 @@ export const Extensions = () => { const extensions = filterString.length === 0 - ? data ?? [] + ? (data ?? []) : (data ?? []).filter((ext) => { const nameMatchesSearch = ext.name.toLowerCase().includes(filterString.toLowerCase()) const searchTermsMatchesSearch = (SEARCH_TERMS[ext.name] || []).some((x) => diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index 8b5203f133e..abfbd2ca145 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -47,9 +47,9 @@ const Migrations = () => { const migrations = search.length === 0 ? data - : data.filter( + : (data.filter( (migration) => migration.version.includes(search) || migration.name?.includes(search) - ) ?? [] + ) ?? []) return ( <> diff --git a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx index 2ecd97f29d3..d2e72f03bc9 100644 --- a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx +++ b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx @@ -8,11 +8,10 @@ import { } from './Privileges.constants' import { usePrivilegesState } from './Privileges.utils' -export interface PrivilegesTableProps - extends Pick< - ReturnType, - 'tableCheckedStates' | 'columnCheckedStates' | 'toggleTablePrivilege' | 'toggleColumnPrivilege' - > { +export interface PrivilegesTableProps extends Pick< + ReturnType, + 'tableCheckedStates' | 'columnCheckedStates' | 'toggleTablePrivilege' | 'toggleColumnPrivilege' +> { columnPrivileges: ColumnPrivilege[] disabled: boolean isApplyingChanges?: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx index 4179dda8497..14b67f4c9be 100644 --- a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx +++ b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx @@ -94,7 +94,7 @@ export const Destinations = () => { const hasDestinations = isDestinationsSuccess && destinationsData?.destinations.length > 0 const filteredDestinations = filterString.length === 0 - ? destinations ?? [] + ? (destinations ?? []) : (destinations ?? []).filter((destination) => destination.name.toLowerCase().includes(filterString.toLowerCase()) ) diff --git a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx index 4cccaf04f92..bddb229e27e 100644 --- a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx +++ b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx @@ -126,13 +126,13 @@ export const UpdateVersionModal = ({

Current version:

{' '} - {isLoadingVersion ? 'Loading...' : currentVersionName ?? 'Unknown'} + {isLoadingVersion ? 'Loading...' : (currentVersionName ?? 'Unknown')}

New version:

{' '} - {isLoadingVersion ? 'Loading...' : newVersionName ?? 'Unknown'} + {isLoadingVersion ? 'Loading...' : (newVersionName ?? 'Unknown')}
diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx index b73c6628a59..e6226e69e2e 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx @@ -294,7 +294,9 @@ export const RestoreToNewProject = () => {

Previous restorations

- {previousClones?.map((c) => )} + {previousClones?.map((c) => ( + + ))}
) : null} diff --git a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx index 26fe813f5bc..8a836b701cc 100644 --- a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx +++ b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx @@ -61,7 +61,7 @@ export const ColumnList = ({ const columns = (filterString.length === 0 - ? selectedTable?.columns ?? [] + ? (selectedTable?.columns ?? []) : selectedTable?.columns?.filter((column) => column.name.includes(filterString))) ?? [] const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedTable?.schema ?? '' }) diff --git a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx index ed7c4101113..d1fc6651aee 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx @@ -30,7 +30,7 @@ export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => { const _minIncrementGb = minIncrementGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize const _maxSizeGb = errors.maxSizeGb ? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb - : maxSizeGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb + : (maxSizeGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb) const growthSize = Math.floor(totalSize * (_growthPercent / 100)) const autoscaleGrowValue = Math.min( diff --git a/apps/studio/components/interfaces/Docs/Authentication.tsx b/apps/studio/components/interfaces/Docs/Authentication.tsx index aa4d72d1668..d38f2440fe8 100644 --- a/apps/studio/components/interfaces/Docs/Authentication.tsx +++ b/apps/studio/components/interfaces/Docs/Authentication.tsx @@ -28,11 +28,11 @@ const Authentication = ({ selectedLang, showApiKey }: AuthenticationProps) => { // [Joshen] ShowApiKey should really be a boolean, its confusing const defaultApiKey = showApiKey !== 'SUPABASE_KEY' - ? anonKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY' + ? (anonKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY') : 'SUPABASE_CLIENT_API_KEY' const serviceApiKey = showApiKey !== 'SUPABASE_KEY' - ? serviceKey?.api_key ?? 'SUPABASE_SERVICE_KEY' + ? (serviceKey?.api_key ?? 'SUPABASE_SERVICE_KEY') : 'SUPABASE_SERVICE_KEY' return ( diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx index e8c224d68e3..255741adb57 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx @@ -63,9 +63,9 @@ export const EdgeFunctionSecrets = () => { const secrets = searchString.length > 0 - ? data?.filter((secret) => secret.name.toLowerCase().includes(searchString.toLowerCase())) ?? - [] - : data ?? [] + ? (data?.filter((secret) => secret.name.toLowerCase().includes(searchString.toLowerCase())) ?? + []) + : (data ?? []) const headers = [ Name, diff --git a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx index f014e3ec747..f2e38f6ddae 100644 --- a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx +++ b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx @@ -176,7 +176,7 @@ export const APIKeys = () => { ? 'JWT secret update failed, new API key may have issues' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating ? 'Updating JWT secret...' - : publishableKey?.api_key ?? anonKey?.api_key + : (publishableKey?.api_key ?? anonKey?.api_key) } /> diff --git a/apps/studio/components/interfaces/Home/ServiceStatus.tsx b/apps/studio/components/interfaces/Home/ServiceStatus.tsx index d6e0b9ccecd..0b1205906a6 100644 --- a/apps/studio/components/interfaces/Home/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/Home/ServiceStatus.tsx @@ -195,7 +195,7 @@ export const ServiceStatus = () => { docsUrl: undefined, isLoading, // If PostgREST has an empty schema, it means it's been disabled - status: extractDbSchema(restStatus) === '' ? 'DISABLED' : restStatus?.status ?? 'UNHEALTHY', + status: extractDbSchema(restStatus) === '' ? 'DISABLED' : (restStatus?.status ?? 'UNHEALTHY'), logsUrl: '/logs/postgrest-logs', }, ...(authEnabled diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx index be8d0c1e921..7151241b9db 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx @@ -216,7 +216,8 @@ export const CronJobTableCell = ({

- Are you sure you want to {active ? 'disable' : 'enable'} the cron job "{jobname}"?{' '} + Are you sure you want to {active ? 'disable' : 'enable'} the cron job "{jobname} + "?{' '}

diff --git a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx index 57fc0b77400..5cc6384f5bf 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx @@ -473,17 +473,17 @@ const TEMPLATE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import( - 'components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview' - ).then((mod) => mod.StripeSyncInstallationPage), + import('components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview').then( + (mod) => mod.StripeSyncInstallationPage + ), { loading: Loading } ) case 'settings': return dynamic( () => - import( - 'components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage' - ).then((mod) => mod.StripeSyncSettingsPage), + import('components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage').then( + (mod) => mod.StripeSyncSettingsPage + ), { loading: Loading } ) } diff --git a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx index 7ac73ae4dfe..dd6aaa902f5 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx @@ -76,9 +76,9 @@ export const useAvailableIntegrations = () => { case 'overview': return dynamic( () => - import( - 'components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index' - ).then((mod) => mod.IntegrationOverviewTabV2), + import('components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index').then( + (mod) => mod.IntegrationOverviewTabV2 + ), { loading: Loading, } diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx index ef6c0330bd1..8cfdf7bd1a5 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx @@ -310,7 +310,7 @@ const ProjectLinker = ({ icon={
{selectedForeignProject - ? getForeignProjectIcon?.(selectedForeignProject) ?? integrationIcon + ? (getForeignProjectIcon?.(selectedForeignProject) ?? integrationIcon) : integrationIcon}
} diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx index c77b2cebfaa..1bcb5bf50de 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx @@ -211,7 +211,7 @@ export function LogDrainDestinationSheetForm({ } const DEFAULT_HEADERS = mode === 'create' - ? CREATE_DEFAULT_HEADERS_BY_TYPE[defaultType] ?? {} + ? (CREATE_DEFAULT_HEADERS_BY_TYPE[defaultType] ?? {}) : defaultConfig?.headers || {} const sentryEnabled = useFlag('SentryLogDrain') diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx index 08bb17f6621..0bd9a8daa23 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx @@ -186,8 +186,8 @@ const PaymentMethodSelection = forwardRef(function PaymentMethodSelection( return { paymentMethod: { id: selectedPaymentMethod } as PaymentMethod, customerName: useAsDefaultBillingAddress ? customerProfile?.billing_name || '' : null, - address: useAsDefaultBillingAddress ? customerProfile?.address ?? null : null, - taxId: useAsDefaultBillingAddress ? taxId ?? null : null, + address: useAsDefaultBillingAddress ? (customerProfile?.address ?? null) : null, + taxId: useAsDefaultBillingAddress ? (taxId ?? null) : null, } } } diff --git a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx index b2fd21acacb..b8e4ccce9ff 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx @@ -290,7 +290,7 @@ export const NewOrgForm = ({ payment_method: paymentMethodId, billing_name: dbTier === 'FREE' ? undefined : customerData?.billing_name, address: dbTier === 'FREE' ? null : customerData?.address, - tax_id: dbTier === 'FREE' ? undefined : customerData?.tax_id ?? undefined, + tax_id: dbTier === 'FREE' ? undefined : (customerData?.tax_id ?? undefined), }) } diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx index 083253d99fc..04006fafd48 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx @@ -127,7 +127,7 @@ export const MemberRow = ({ member }: MemberRowProps) => { const roleName = (role?.name ?? '').split('_')[0] const projectsApplied = role?.projects.length === 0 - ? orgProjects?.map((p) => p.name) ?? [] + ? (orgProjects?.map((p) => p.name) ?? []) : (role?.projects ?? []) .map(({ ref }) => orgProjects?.find((p) => p.ref === ref)?.name ?? '') .filter((x) => x.length > 0) diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx index c8104faa3b5..256340eb27e 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx @@ -112,7 +112,7 @@ export const PlatformWebhooksPage = ({ scope, endpointId }: PlatformWebhooksPage ) const isEndpointView = !!selectedEndpoint const headerTitle = isEndpointView ? 'Endpoint' : scopeLabel - const headerDescription = isEndpointView ? selectedEndpoint?.url ?? '' : scopeDescription + const headerDescription = isEndpointView ? (selectedEndpoint?.url ?? '') : scopeDescription const endpointPendingDelete = useMemo( () => endpoints.find((endpoint) => endpoint.id === endpointIdPendingDelete) ?? null, @@ -380,7 +380,7 @@ export const PlatformWebhooksPage = ({ scope, endpointId }: PlatformWebhooksPage mode={panel === 'create' ? 'create' : 'edit'} scope={scope} orgSlug={scope === 'project' ? selectedOrganization?.slug : undefined} - endpoint={panel === 'edit' ? selectedEndpoint ?? undefined : undefined} + endpoint={panel === 'edit' ? (selectedEndpoint ?? undefined) : undefined} enabledOverride={panel === 'edit' ? editEnabledOverride : null} eventTypes={eventTypeOptions} onClose={() => { diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx index 5d0b0893384..8ea337222de 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx @@ -87,7 +87,7 @@ export const Introduction = ({ showKeys, language, apikey, endpoint }: ContentPr size="small" value={ showKeys - ? serviceApiKey ?? 'SUPABASE_CLIENT_SERVICE_KEY' + ? (serviceApiKey ?? 'SUPABASE_CLIENT_SERVICE_KEY') : 'Reveal API keys via dropdown in the header' } className="w-full" diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx index 6ab7cd4cfb6..a2ead023666 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx @@ -57,7 +57,7 @@ export const ProjectAPIDocs = () => { const { anonKey } = getKeys(apiKeys) const apikey = showKeys - ? anonKey?.api_key ?? 'SUPABASE_CLIENT_ANON_KEY' + ? (anonKey?.api_key ?? 'SUPABASE_CLIENT_ANON_KEY') : 'SUPABASE_CLIENT_ANON_KEY' return ( diff --git a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx index 9c6b54b3ad0..01d41c55a13 100644 --- a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx @@ -88,8 +88,8 @@ export const PostgresVersionSelector = ({ const versions = type === 'create' - ? createVersions?.available_versions ?? [] - : unpauseVersions?.available_versions ?? [] + ? (createVersions?.available_versions ?? []) + : (unpauseVersions?.available_versions ?? []) const availableVersions = versions.sort((a, b) => a.version.localeCompare(b.version)).reverse() const { postgresVersionSelection } = form.watch() diff --git a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx index a9b3da46e77..4970b6440de 100644 --- a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx @@ -46,7 +46,7 @@ export const ActivityStats = () => { [migrationsData] ) const migrationLabelText = - migrationsData.length === 0 ? 'No migrations' : latestMigration?.name ?? 'Unknown' + migrationsData.length === 0 ? 'No migrations' : (latestMigration?.name ?? 'Unknown') const { data: backupsData, isPending: isLoadingBackups } = useBackupsQuery({ projectRef: project?.ref, diff --git a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx index fbdf0c87c49..26f78ae7b07 100644 --- a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx @@ -131,7 +131,7 @@ export const ServiceStatus = () => { docsUrl: undefined, isLoading, // If PostgREST has an empty schema, it means it's been disabled - status: extractDbSchema(restStatus) === '' ? 'DISABLED' : restStatus?.status ?? 'UNHEALTHY', + status: extractDbSchema(restStatus) === '' ? 'DISABLED' : (restStatus?.status ?? 'UNHEALTHY'), logsUrl: '/logs/postgrest-logs', }, ...(authEnabled diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx index 137e3b9b2d7..77ee666ff8d 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx @@ -71,7 +71,7 @@ export function useQueryInsightsTableColumns({ name: col.name, cellClass: `column-${col.id}`, resizable: true, - minWidth: col.id === 'prop_total_time' ? timeConsumedWidth : col.minWidth ?? 120, + minWidth: col.id === 'prop_total_time' ? timeConsumedWidth : (col.minWidth ?? 120), sortable: isSortable, headerCellClass: 'first:pl-6 cursor-pointer', renderHeaderCell: () => { diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts index 59a635f358b..65128a13482 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts @@ -49,7 +49,7 @@ export function useSupamonitorIndexAdvisor(rows: QueryPerformanceRow[]): QueryPe // undefined/pending means data hasn't arrived yet — store undefined so // classifyQuery can defer slow classification and avoid flicker. const isReady = result?.status === 'success' || result?.status === 'error' - return [query, isReady ? result.data ?? null : undefined] + return [query, isReady ? (result.data ?? null) : undefined] }) ) @@ -57,6 +57,6 @@ export function useSupamonitorIndexAdvisor(rows: QueryPerformanceRow[]): QueryPe ...row, index_advisor_result: resultByQuery.has(row.query) ? resultByQuery.get(row.query) - : row.index_advisor_result ?? null, + : (row.index_advisor_result ?? null), })) } diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx index 21524688097..ca0a1306058 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx @@ -109,7 +109,7 @@ export const QueryPerformanceGrid = ({ minWidth: col.id === 'prop_total_time' ? calculateTimeConsumedWidth((aggregatedData as any) ?? []) - : col.minWidth ?? 120, + : (col.minWidth ?? 120), sortable: !nonSortableColumns.includes(col.id), headerCellClass: 'first:pl-6 cursor-pointer', renderHeaderCell: () => { diff --git a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx index ddb07e9ba81..ec63ddb3a6b 100644 --- a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx +++ b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx @@ -33,10 +33,10 @@ export const RoleImpersonationSelector = ({ const isAuthenticatedOptionFullySelected = Boolean( selectedOption === 'authenticated' && - state.role?.type === 'postgrest' && - state.role.role === 'authenticated' && - (('user' in state.role && state.role.user) || - ('externalAuth' in state.role && state.role.externalAuth)) // Check for either auth type + state.role?.type === 'postgrest' && + state.role.role === 'authenticated' && + (('user' in state.role && state.role.user) || + ('externalAuth' in state.role && state.role.externalAuth)) // Check for either auth type ) function onSelectedChange(value: PostgrestRole) { diff --git a/apps/studio/components/interfaces/SQLEditor/README.md b/apps/studio/components/interfaces/SQLEditor/README.md index 1370eb5885f..57eba931f60 100644 --- a/apps/studio/components/interfaces/SQLEditor/README.md +++ b/apps/studio/components/interfaces/SQLEditor/README.md @@ -5,7 +5,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ## UI structure - Folders and snippets (in the product menu) are rendered via `SQLEditorMenu` and `SQLEditorNav`, in which the data are all loaded from the API via React Query directly. (Refer to point 3 under "Data Structure" below) - - [`SQLEditorMenu`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx): Wraps around `SQLEditorNav` + renders search input + View running queries button - [`SQLEditorNav`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx): Renders the 3 collapsible snippet sections @@ -26,7 +25,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ## Data fetching - The endpoint to fetch snippets and folders are via [`useSQLSnippetFoldersQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-folders-query.ts) and [`useSqlSnippetsQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-snippets-query.ts), both of which are paginated (limit set at 100) - - [`useSQLSnippetFoldersQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-folders-query.ts): Specifically for fetching private snippets and folders - [`useSqlSnippetsQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-snippets-query.ts): For fetching shared and favorite snippets @@ -39,7 +37,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, - Snippets and folders are all initially loaded via React Query in [`SQLEditorNav`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx), which are then initialized into the Valtio store via [`snapV2.addSnippet`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx#L415) calls in the `useEffects` - On `/editor/sql` - - We'll redirect users to the last visited snippet if there's one (`/editor/sql/[id]`), otherwise will redirect to `/editor/sql/new` (within [`[id].tsx`](https://github.com/supabase/supabase/blob/master/apps/studio/pages/project/%5Bref%5D/sql/%5Bid%5D.tsx) ) - On `/editor/sql/[id]` @@ -48,7 +45,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ### Writing a snippet - On `/editor/sql/new`: - - The first character input will [update the Valtio store](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx#L192) with a snippet skeleton via `snapV2.addSnippet` and user will be redirected to `/editor/sql/[id]`, using the `id` from the skeleton - Note that `snapV2.addSnippet` only handles adding snippets to the store and does not queue the snippet for saving - Subsequent character inputs will follow below as per `/editor/sql/[id]` @@ -60,7 +56,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ### Running a snippet - There's several safeguards in place before we run the query - - [Check for destructive operations](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L293): Will open a confirmation modal before running the query - [Check for update statements without where clause](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L300): Will open a confirmation modal before running the query - [Append a preset limit to the query if it's a select](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L333): To prevent accidentally running an expensive query on the database. Users can explicitly opt out of this to set "No limit" diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx index 7f8898d5a67..56c376be175 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx @@ -204,7 +204,7 @@ export const SQLEditor = () => { const editor = editorRef.current const monaco = monacoRef.current - const startLineNumber = hasSelection ? editor?.getSelection()?.startLineNumber ?? 0 : 0 + const startLineNumber = hasSelection ? (editor?.getSelection()?.startLineNumber ?? 0) : 0 const formattedError = error.formattedError ?? '' const lineError = formattedError.slice(formattedError.indexOf('LINE')) @@ -280,7 +280,7 @@ export const SQLEditor = () => { const selection = editor.getSelection() const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() const formattedSql = formatSql(sql) @@ -318,7 +318,7 @@ export const SQLEditor = () => { const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() const hasDestructiveOperations = checkDestructiveQuery(sql) @@ -418,7 +418,7 @@ export const SQLEditor = () => { const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() // Check for multiple statements - EXPLAIN only works on a single statement @@ -881,7 +881,7 @@ export const SQLEditor = () => { snippetName={ urlId === 'new' ? generatedNewSnippetName - : snapV2.snippets[id]?.snippet.name ?? generatedNewSnippetName + : (snapV2.snippets[id]?.snippet.name ?? generatedNewSnippetName) } className={cn(isDiffOpen && 'hidden')} editorRef={editorRef} diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts index 0b36ab1e4b3..9845ca03f2b 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts @@ -80,7 +80,7 @@ export const generateNodes = ({ region: primary.cloud_provider === 'FLY' ? { name: 'Singapore (sin)', key: 'SOUTHEAST_ASIA' } - : primaryRegion ?? { name: primary.region }, + : (primaryRegion ?? { name: primary.region }), provider: primary.cloud_provider, inserted_at: primary.inserted_at, computeSize: primary.size, diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx index 243df5a923d..688cf480c36 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx @@ -41,7 +41,7 @@ const VercelIntegrationConnectionForm = ({ // but through a separate marketplace mechanism. It's not theoretically necessary, but we might have some stale data. const { data: org } = useSelectedOrganizationQuery() const envSyncTargets = - org?.managed_by === 'vercel-marketplace' ? [] : connection.env_sync_targets ?? [] + org?.managed_by === 'vercel-marketplace' ? [] : (connection.env_sync_targets ?? []) const FormSchema = z.object({ environmentVariablesProduction: z.boolean().default(envSyncTargets.includes('production')), diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts index 46d2e1c0032..5515dd4c94b 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -811,7 +811,7 @@ const LOG_TABLE_TO_SERVICE_LABEL: Record = { function extractServiceLabelFromSql(sql: string): string | null { const match = sql.match(/\bfrom\s+(\w+)/i) const tableName = match?.[1] - return tableName ? LOG_TABLE_TO_SERVICE_LABEL[tableName] ?? null : null + return tableName ? (LOG_TABLE_TO_SERVICE_LABEL[tableName] ?? null) : null } export function buildLogsPrompt(rows: LogData[], queryType?: string, sqlQuery?: string): string { diff --git a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx index ab73a2db457..62552e195b1 100644 --- a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx @@ -109,7 +109,7 @@ export const EditBucketModal = ({ visible, bucket, onClose }: EditBucketModalPro name: bucket?.name ?? '', public: bucket?.public, has_file_size_limit: Boolean(bucket?.file_size_limit), - formatted_size_limit: bucket?.file_size_limit ? fileSizeLimit ?? 0 : undefined, + formatted_size_limit: bucket?.file_size_limit ? (fileSizeLimit ?? 0) : undefined, allowed_mime_types: (bucket?.allowed_mime_types ?? []).join(', '), } diff --git a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx index 91f29c19f7c..6246d881d6e 100644 --- a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx +++ b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx @@ -108,7 +108,7 @@ function ProjectSelector({ form, orgSlug, projectRef }: ProjectSelectorProps) { ) : !field.value || field.value === NO_PROJECT_MARKER ? ( 'No specific project' ) : ( - project?.name ?? 'Unknown project' + (project?.name ?? 'Unknown project') )} ) diff --git a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx index 37613bfa3e2..ea0b66407c7 100644 --- a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx @@ -116,7 +116,7 @@ const DeleteConfirmationDialogs = ({ const numRows = snap.confirmationDialog?.type === 'row' ? snap.confirmationDialog.allRowsSelected - ? snap.confirmationDialog.numRows ?? 0 + ? (snap.confirmationDialog.numRows ?? 0) : snap.confirmationDialog.rows.length : 0 diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx index 8fd48e910d2..a828d212864 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx @@ -725,7 +725,7 @@ export const createTable = async ({ async (span) => { const rowCount = importContent.file ? importContent.rowCount - : importContent.rows?.length ?? 0 + : (importContent.rows?.length ?? 0) span.setAttribute('import.row_count', rowCount) span.setAttribute('import.method', importContent.file ? 'csv' : 'paste') diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx index 2172a604f16..b163ab1d651 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx @@ -126,9 +126,9 @@ const useTableApiAccessHandler = ( const canResolvePrivilegeParams = Boolean( shouldReadExistingGrants && - project?.ref && - permissionsTemplateSchema && - permissionsTemplateTable + project?.ref && + permissionsTemplateSchema && + permissionsTemplateTable ) const isPrivilegesQueryEnabled = enabled && canResolvePrivilegeParams const apiAccessStatus = useTableApiAccessQuery( diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx index 64e0e756627..0757e887775 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx @@ -112,8 +112,8 @@ export function generateDynamicColumns(data: ColumnSchema[]): { const value = row.getValue('status') const label = value != null - ? STATUS_CODE_LABELS[String(value) as keyof typeof STATUS_CODE_LABELS] ?? - 'Unknown status' + ? (STATUS_CODE_LABELS[String(value) as keyof typeof STATUS_CODE_LABELS] ?? + 'Unknown status') : null return (
diff --git a/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx b/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx index dd603b84db3..958dd548ad2 100644 --- a/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx @@ -16,8 +16,7 @@ export function AppLayoutDropdownError({ message }: AppLayoutDropdownErrorProps) ) } -interface AppLayoutDropdownTriggerButtonProps - extends React.ButtonHTMLAttributes { +interface AppLayoutDropdownTriggerButtonProps extends React.ButtonHTMLAttributes { className?: string } diff --git a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx index 7588622b55a..1449d9e9b11 100644 --- a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx @@ -57,9 +57,9 @@ export const BranchDropdown = ({ branches && branches.length > 0 ? mainBranch ? [mainBranch].concat(restOfBranches ?? []) - : restOfBranches ?? [] + : (restOfBranches ?? []) : [defaultMainBranch] - const branchList = isBranchingEnabled ? sortedBranches ?? [] : [defaultMainBranch] + const branchList = isBranchingEnabled ? (sortedBranches ?? []) : [defaultMainBranch] const commandContent = ( { const shouldFetch = Boolean( !!slug && - org?.plan?.id !== 'free' && - isDismissLoaded && - !isDismissed && - !!org?.organization_missing_tax_id + org?.plan?.id !== 'free' && + isDismissLoaded && + !isDismissed && + !!org?.organization_missing_tax_id ) const { data: customerProfile } = useOrganizationCustomerProfileQuery( { slug }, diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts index 3aac3cf2469..fede88d68ac 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts @@ -17,7 +17,7 @@ export function getProjectBranchSelectorState(params: { const { selectedBranch, isBranchingEnabled, selectedOrganization } = params const isMainBranch = !isBranchingEnabled || selectedBranch?.is_default === true - const branchDisplayName = isBranchingEnabled ? selectedBranch?.name ?? 'main' : 'main' + const branchDisplayName = isBranchingEnabled ? (selectedBranch?.name ?? 'main') : 'main' const selectedOrgInitial = selectedOrganization?.name?.trim().charAt(0).toUpperCase() ?? 'O' const organizationHref = selectedOrganization?.slug ? `/org/${selectedOrganization.slug}` diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx index 46fabb5d205..ad7a3c22c87 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx @@ -38,8 +38,10 @@ import { cn, } from 'ui' -interface SQLEditorTreeViewItemProps - extends Omit, 'name' | 'xPadding'> { +interface SQLEditorTreeViewItemProps extends Omit< + ComponentProps, + 'name' | 'xPadding' +> { element: any isMultiSelected?: boolean status?: 'editing' | 'saving' | 'idle' diff --git a/apps/studio/components/layouts/Tabs/Tabs.tsx b/apps/studio/components/layouts/Tabs/Tabs.tsx index 842caec30d2..a84460da489 100644 --- a/apps/studio/components/layouts/Tabs/Tabs.tsx +++ b/apps/studio/components/layouts/Tabs/Tabs.tsx @@ -140,7 +140,7 @@ export const EditorTabs = () => { diff --git a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx index 9ae8e9b16b4..6ca37f7c1f1 100644 --- a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx @@ -151,7 +151,7 @@ export const DisplayBlockRenderer = ({ const connectionString = queryType === 'mutation' ? postgresConnectionString - : readOnlyConnectionString ?? postgresConnectionString + : (readOnlyConnectionString ?? postgresConnectionString) if (!connectionString) { const fallbackMessage = 'Unable to find a database connection to execute this query.' diff --git a/apps/studio/components/ui/CardButton.tsx b/apps/studio/components/ui/CardButton.tsx index 17581851322..7aadcfb3ca7 100644 --- a/apps/studio/components/ui/CardButton.tsx +++ b/apps/studio/components/ui/CardButton.tsx @@ -33,8 +33,10 @@ interface UrlContainerProps extends Omit, 'title'> {} -interface ButtonContainerProps - extends Omit, 'title'> {} +interface ButtonContainerProps extends Omit< + React.ButtonHTMLAttributes, + 'title' +> {} // Union of all container props type ContainerProps = diff --git a/apps/studio/components/ui/Charts/Charts.types.tsx b/apps/studio/components/ui/Charts/Charts.types.tsx index 1617c6813a8..94e878026d9 100644 --- a/apps/studio/components/ui/Charts/Charts.types.tsx +++ b/apps/studio/components/ui/Charts/Charts.types.tsx @@ -1,14 +1,13 @@ -export interface CommonChartProps - extends Pick< - HeaderType, - | 'highlightedValue' - | 'highlightedLabel' - | 'customDateFormat' - | 'data' - | 'format' - | 'minimalHeader' - | 'displayDateInUtc' - > { +export interface CommonChartProps extends Pick< + HeaderType, + | 'highlightedValue' + | 'highlightedLabel' + | 'customDateFormat' + | 'data' + | 'format' + | 'minimalHeader' + | 'displayDateInUtc' +> { title?: string className?: string valuePrecision?: number diff --git a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx index a533099da76..057e3135da2 100644 --- a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx +++ b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx @@ -347,7 +347,9 @@ export const CustomLabel = ({
- {items?.map((entry, index) => )} + {items?.map((entry, index) => ( + + ))}
diff --git a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx index 7d0d7b1f0fa..fd14a2300a6 100644 --- a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx +++ b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx @@ -55,9 +55,8 @@ describe('useChartHoverState', () => { localStorageMock.setItem('supabase-chart-tooltip-sync-enabled', 'true') vi.resetModules() - const { useChartHoverState: useChartHoverStateWithStorage } = await import( - './useChartHoverState' - ) + const { useChartHoverState: useChartHoverStateWithStorage } = + await import('./useChartHoverState') const { result } = renderHook(() => useChartHoverStateWithStorage('chart1')) @@ -70,9 +69,8 @@ describe('useChartHoverState', () => { localStorageMock.setItem('supabase-chart-tooltip-sync-enabled', 'invalid-json') vi.resetModules() - const { useChartHoverState: useChartHoverStateWithCorrupted } = await import( - './useChartHoverState' - ) + const { useChartHoverState: useChartHoverStateWithCorrupted } = + await import('./useChartHoverState') const { result } = renderHook(() => useChartHoverStateWithCorrupted('chart1')) diff --git a/apps/studio/components/ui/CopyButton.tsx b/apps/studio/components/ui/CopyButton.tsx index 33f1122f0fd..87fd9c183ca 100644 --- a/apps/studio/components/ui/CopyButton.tsx +++ b/apps/studio/components/ui/CopyButton.tsx @@ -56,7 +56,7 @@ const CopyButton = forwardRef( {...props} className={cn({ 'px-1': iconOnly }, props.className)} icon={ - showCopied ? : props.icon ?? + showCopied ? : (props.icon ?? ) } > {!iconOnly && <>{children ?? (showCopied ? copiedLabel : copyLabel)}} diff --git a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx index fb161601636..235fbae746f 100644 --- a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx +++ b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx @@ -24,8 +24,10 @@ import { DropdownMenuTrigger, } from 'ui' -interface DataTableSheetRowActionProps> - extends ComponentPropsWithRef { +interface DataTableSheetRowActionProps< + TData, + TFields extends DataTableFilterField, +> extends ComponentPropsWithRef { fieldValue: TFields['value'] filterFields: TFields[] value: string | number diff --git a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx index 7a49998c1a8..7495725d680 100644 --- a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx +++ b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx @@ -38,8 +38,7 @@ interface DataTableBaseContextType { } interface DataTableContextType - extends DataTableStateContextType, - DataTableBaseContextType {} + extends DataTableStateContextType, DataTableBaseContextType {} export const DataTableContext = createContext | null>(null) diff --git a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx index f509d77a5ff..30af2a93c72 100644 --- a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx +++ b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx @@ -85,7 +85,7 @@ export const EdgeFunctionBlock = ({ onDragStart={onDragStart} actions={ hideDeployButton || !onDeploy ? ( - actions ?? null + (actions ?? null) ) : ( <> )} diff --git a/apps/studio/components/ui/ProfileImage.tsx b/apps/studio/components/ui/ProfileImage.tsx index 1eb710efb2d..c499e4a90e5 100644 --- a/apps/studio/components/ui/ProfileImage.tsx +++ b/apps/studio/components/ui/ProfileImage.tsx @@ -24,12 +24,12 @@ export const ProfileImage = ({ alt, src, placeholder, className }: ProfileImageP onError={() => setHasInvalidImg(true)} /> ) : ( - placeholder ?? ( + (placeholder ?? (
- ) + )) ) } diff --git a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx index 01fa1bb35c2..bf97e459a8f 100644 --- a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx +++ b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx @@ -200,7 +200,7 @@ export const DisplayApiSettings = ({ ? 'JWT secret update failed, new API key may have issues' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating ? 'Updating JWT secret...' - : x?.api_key ?? 'You need additional permissions to view API keys' + : (x?.api_key ?? 'You need additional permissions to view API keys') } onChange={() => {}} /> diff --git a/apps/studio/components/ui/VirtualizedTable.tsx b/apps/studio/components/ui/VirtualizedTable.tsx index 25407b37114..13aec730a49 100644 --- a/apps/studio/components/ui/VirtualizedTable.tsx +++ b/apps/studio/components/ui/VirtualizedTable.tsx @@ -139,8 +139,10 @@ export const VirtualizedTable = ({ ) } -interface VirtualizedTableBodyProps - extends Omit, 'children'> { +interface VirtualizedTableBodyProps extends Omit< + React.ComponentProps, + 'children' +> { emptyContent?: ReactNode leadingContent?: ReactNode trailingContent?: ReactNode @@ -167,7 +169,7 @@ export const VirtualizedTableBody = ({ {leadingContent} {data.length === 0 ? ( - emptyContent ?? null + (emptyContent ?? null) ) : ( <> {paddingTop > 0 && ( diff --git a/apps/studio/hooks/misc/useCheckEntitlements.ts b/apps/studio/hooks/misc/useCheckEntitlements.ts index 12d258b8cdd..2c67d235243 100644 --- a/apps/studio/hooks/misc/useCheckEntitlements.ts +++ b/apps/studio/hooks/misc/useCheckEntitlements.ts @@ -75,7 +75,7 @@ export function useHasEntitlementAccess(organizationSlug?: string) { return useCallback( (key: string) => IS_PLATFORM - ? entitlementsData?.entitlements.find((e) => e.feature.key === key)?.hasAccess ?? false + ? (entitlementsData?.entitlements.find((e) => e.feature.key === key)?.hasAccess ?? false) : true, [entitlementsData] ) @@ -130,7 +130,7 @@ export function useCheckEntitlements( : isSuccessEntitlements return { - hasAccess: IS_PLATFORM ? entitlement?.hasAccess ?? false : true, + hasAccess: IS_PLATFORM ? (entitlement?.hasAccess ?? false) : true, isLoading: IS_PLATFORM ? isLoading : false, isSuccess: IS_PLATFORM ? isSuccess : true, getEntitlementNumericValue: () => getEntitlementNumericValue(entitlement), diff --git a/apps/studio/lib/ai/org-ai-details.test.ts b/apps/studio/lib/ai/org-ai-details.test.ts index d36c4168085..98e213ca829 100644 --- a/apps/studio/lib/ai/org-ai-details.test.ts +++ b/apps/studio/lib/ai/org-ai-details.test.ts @@ -47,9 +47,8 @@ describe('ai/org-ai-details', () => { const subscriptionQuery = await import('data/subscriptions/org-subscription-query') const settingsQuery = await import('data/config/project-settings-v2-query') const aiHook = await import('hooks/misc/useOrgOptedIntoAi') - const subscriptionUtils = await import( - 'components/interfaces/Billing/Subscription/Subscription.utils' - ) + const subscriptionUtils = + await import('components/interfaces/Billing/Subscription/Subscription.utils') const entitlementsQuery = await import('data/entitlements/entitlements-query') mockGetOrganizations = vi.mocked(orgsQuery.getOrganizations) diff --git a/apps/studio/package.json b/apps/studio/package.json index d52113e0134..caf3c5239d9 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -200,7 +200,6 @@ "next-router-mock": "^0.9.13", "node-mocks-http": "^1.17.2", "postcss": "^8.5.3", - "prettier": "3.2.4", "raw-loader": "^4.0.2", "require-in-the-middle": "^8.0.0", "tailwindcss": "catalog:", diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index ea2086166f9..a259737a578 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -141,7 +141,7 @@ const Wizard: NextPageWithLayout = () => { // an in-between render, but watchedInstanceSize is still undefined from the // form state carried over from the free plan. To avoid this, we set a // default instance size in this case. - const instanceSize = canChooseInstanceSize ? watchedInstanceSize ?? sizes[0] : undefined + const instanceSize = canChooseInstanceSize ? (watchedInstanceSize ?? sizes[0]) : undefined const { data: membersExceededLimit = [] } = useFreeProjectLimitCheckQuery( { slug }, @@ -227,7 +227,7 @@ const Wizard: NextPageWithLayout = () => { const availableOrioleVersion = useAvailableOrioleImageVersion( { cloudProvider: cloudProvider as CloudProvider, - dbRegion: smartRegionEnabled ? dbRegionExact : dbRegion ?? '', + dbRegion: smartRegionEnabled ? dbRegionExact : (dbRegion ?? ''), organizationSlug: organization, }, { enabled: currentOrg !== null } @@ -304,7 +304,7 @@ const Wizard: NextPageWithLayout = () => { const { smartGroup = [], specific = [] } = availableRegionsData?.all ?? {} const selectedRegion = smartRegionEnabled - ? smartGroup.find((x) => x.name === dbRegion) ?? specific.find((x) => x.name === dbRegion) + ? (smartGroup.find((x) => x.name === dbRegion) ?? specific.find((x) => x.name === dbRegion)) : undefined const data: ProjectCreateVariables = { diff --git a/apps/studio/pages/project/[ref]/logs/explorer/index.tsx b/apps/studio/pages/project/[ref]/logs/explorer/index.tsx index 8f6c10628d9..340f4609f1e 100644 --- a/apps/studio/pages/project/[ref]/logs/explorer/index.tsx +++ b/apps/studio/pages/project/[ref]/logs/explorer/index.tsx @@ -98,7 +98,7 @@ export const LogsExplorerPage: NextPageWithLayout = () => { const { logsDefaultQuery } = useCustomContent(['logs:default_query']) const PLACEHOLDER_QUERY = IS_PLATFORM - ? logsDefaultQuery ?? PLATFORM_PLACEHOLDER_QUERY + ? (logsDefaultQuery ?? PLATFORM_PLACEHOLDER_QUERY) : LOCAL_PLACEHOLDER_QUERY const [editorValue, setEditorValue] = useState(PLACEHOLDER_QUERY) diff --git a/apps/ui-library/components/side-navigation-item.tsx b/apps/ui-library/components/side-navigation-item.tsx index f1259c10886..b92af8bfe0a 100644 --- a/apps/ui-library/components/side-navigation-item.tsx +++ b/apps/ui-library/components/side-navigation-item.tsx @@ -14,8 +14,7 @@ import { SidebarNavItem } from '@/types/nav' // 2. AnchorHTMLAttributes - for standard HTML anchor props (className, etc) // We omit href from both since we compute it internally from item.href interface NavigationItemProps - extends Omit, - Omit, 'href'> { + extends Omit, Omit, 'href'> { item: SidebarNavItem onClick?: (e: React.MouseEvent) => void } diff --git a/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx b/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx index eeade1a42ad..48b88918e58 100644 --- a/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx +++ b/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx @@ -18,8 +18,7 @@ const avatarStackVariants = cva('flex -space-x-4 -space-y-4', { }) export interface AvatarStackProps - extends React.HTMLAttributes, - VariantProps { + extends React.HTMLAttributes, VariantProps { avatars: { name: string; image: string }[] maxAvatarsAmount?: number } diff --git a/apps/ui-library/registry/default/components/ui/badge.tsx b/apps/ui-library/registry/default/components/ui/badge.tsx index 32aa3294de5..3f10e53b172 100644 --- a/apps/ui-library/registry/default/components/ui/badge.tsx +++ b/apps/ui-library/registry/default/components/ui/badge.tsx @@ -23,8 +23,7 @@ const badgeVariants = cva( ) export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} + extends React.HTMLAttributes, VariantProps {} function Badge({ className, variant, ...props }: BadgeProps) { return
diff --git a/apps/ui-library/registry/default/components/ui/button.tsx b/apps/ui-library/registry/default/components/ui/button.tsx index f8dd6acec5d..1c2286b0deb 100644 --- a/apps/ui-library/registry/default/components/ui/button.tsx +++ b/apps/ui-library/registry/default/components/ui/button.tsx @@ -32,8 +32,7 @@ const buttonVariants = cva( ) export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean } diff --git a/apps/ui-library/registry/default/components/ui/switch.tsx b/apps/ui-library/registry/default/components/ui/switch.tsx index 66d67699b31..70bea9c68c2 100644 --- a/apps/ui-library/registry/default/components/ui/switch.tsx +++ b/apps/ui-library/registry/default/components/ui/switch.tsx @@ -37,7 +37,8 @@ const switchThumbVariants = cva( ) export interface SwitchProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps {} const Switch = React.forwardRef, SwitchProps>( diff --git a/apps/www/_blog/2020-10-30-improved-dx.mdx b/apps/www/_blog/2020-10-30-improved-dx.mdx index 4d05c47cd61..7992694a657 100644 --- a/apps/www/_blog/2020-10-30-improved-dx.mdx +++ b/apps/www/_blog/2020-10-30-improved-dx.mdx @@ -118,4 +118,5 @@ To summarise the steps: - Become a [sponsor](https://github.com/sponsors/supabase) [^1]: Removed link on June 14 2022 for search optimization: page currently does not exist + [^2]: Removed link on June 14 2022 for search optimization: page currently does not exist diff --git a/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx b/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx index 9fed32e24d5..60f2e04eaa6 100644 --- a/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx +++ b/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx @@ -418,4 +418,5 @@ By the way, if you like working on PostgreSQL tooling and extensions: we are hir - [Realtime Postgres RLS on Supabase](https://supabase.com/blog/realtime-row-level-security-in-postgresql) [^1]: You can see the `ProcessUtility_hook` declaration [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L75-L76) and its usage [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L515-L527). + [^2]: This is also done on [pg_stat_statements](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/pg_stat_statements/pg_stat_statements.c#L1130-L1137) and [sepgsql](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/sepgsql/hooks.c#L381-L388). diff --git a/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx b/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx index cf86b2ef835..b2d2671dd7b 100644 --- a/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx +++ b/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx @@ -43,8 +43,12 @@ We were absolutely blown away by [all the amazing projects](/blog/hackathon-winn Who else deserves the Gold Supabase Tee? 👀 https://t.co/XPWw02kZad

- — Supabase (@supabase) September 22, 2021 - + — Supabase (@supabase){' '} + + September 22, 2021 + + + ### Prize categories @@ -93,10 +97,15 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2021-11-30-supabase-studio.mdx b/apps/www/_blog/2021-11-30-supabase-studio.mdx index 42c259b3ddf..f52abeb8819 100644 --- a/apps/www/_blog/2021-11-30-supabase-studio.mdx +++ b/apps/www/_blog/2021-11-30-supabase-studio.mdx @@ -56,9 +56,9 @@ Eventually we decided to open source all the frontend code, a shared codebase fo Special shout out - Sentry do a fantastic job of - documenting their strategy - for managing a shared codebase and served as a great model for Supabase. + Sentry do a fantastic job of{' '} + documenting their strategy for + managing a shared codebase and served as a great model for Supabase. ## Build in public diff --git a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx index 11463b4c083..f62219f8e1a 100644 --- a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx +++ b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx @@ -22,17 +22,20 @@ Back in May 2020, we [tweeted about](https://twitter.com/supabase/status/1265922

Really impressed with - @logflare_logs. We've been - on the front page of + @logflare_logs. We've + been on the front page of #hackernews - for 24 hours anticipating the HN hug of death. Looks like we made it through OK and Logflare has - been ingesting everything without breaking a sweat - https://t.co/RWKHIgmWh6 - pic.twitter.com/dQ2xqFTdco + for 24 hours anticipating the HN hug of death. Looks like we made it through OK and Logflare + has been ingesting everything without breaking a sweat{' '} + https://t.co/RWKHIgmWh6{' '} + pic.twitter.com/dQ2xqFTdco

- — Supabase (@supabase) May 28, 2020 + — Supabase (@supabase){' '} + + May 28, 2020 +
diff --git a/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx b/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx index a8c85b30816..72281e71045 100644 --- a/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx +++ b/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx @@ -39,8 +39,12 @@ The Supabase team will be participating as well, for example [Jon](https://twitt https://t.co/wgRBu92Bq4 pic.twitter.com/i1eD1pdA8I

- — Supabase (@supabase) November 24, 2021 - + — Supabase (@supabase){' '} + + November 24, 2021 + + + ### Prize categories @@ -89,8 +93,12 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa @supabase hackathon! 🥳 https://t.co/rm5HBuju73

- — Josh Cawthorne (@cawthornejosh) August 10, 2021 - + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx b/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx index a6af36a0d96..28db8e1c23a 100644 --- a/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx +++ b/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx @@ -19,13 +19,19 @@ Last week [Supabase UI](https://ui.supabase.com/), our open-source UI component + — Supabase (@supabase){' '} + + January 13, 2022 + + + Thanks to your contributions and upvotes, Supabase UI has made it to the finals, and to celebrate we'd like to invite you all to hang out with us on Discord (at least whoever manages to stay up) to watch the Awards Ceremony on Thursday Jan 27th at 9am PT (Thursday 5pm GMT, Friday 1am SG). diff --git a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx index 27e1f94c084..81ceb8e57f2 100644 --- a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx +++ b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx @@ -114,15 +114,18 @@ Divjoy announced their [Supabase Integration](https://divjoy.com/?database=supab + — n8n.io (@n8n_io){' '} + + January 10, 2022 + + + ### Python Upgrades @@ -140,8 +143,12 @@ We're having a 24/7\*365 meme-fest on [Twitter](https://twitter.com/supabase)

invest in good relationships pic.twitter.com/bGiBE7FRFQ

- — Supabase (@supabase) December 28, 2021 - + — Supabase (@supabase){' '} + + December 28, 2021 + + + ### TikTok diff --git a/apps/www/_blog/2022-03-08-postgres-audit.mdx b/apps/www/_blog/2022-03-08-postgres-audit.mdx index 9cee58a0435..e36fe02037f 100644 --- a/apps/www/_blog/2022-03-08-postgres-audit.mdx +++ b/apps/www/_blog/2022-03-08-postgres-audit.mdx @@ -124,8 +124,8 @@ create table audit.record_version ( Postgres version compatibility

The table above uses PostgreSQL's built-in - uuid functionality, which is - available from version 14. For backwards compatibility you can use the uuid-ossp extension. + uuid functionality, which + is available from version 14. For backwards compatibility you can use the uuid-ossp extension.

create extension if not exists "uuid-ossp"; diff --git a/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx b/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx index d20f1b00a5a..3df6234f7f0 100644 --- a/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx +++ b/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx @@ -40,10 +40,15 @@ Finally, we're delighted to be partnering with [the Future Forest Company](https

+ — Supabase (@supabase){' '} + + November 24, 2021 + + + ### Prize categories @@ -92,10 +97,15 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx b/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx index 44186213f2d..42fca0b38b1 100644 --- a/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx +++ b/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx @@ -161,7 +161,8 @@ Slack links have the following format: https://ORGANIZATION.slack.com/archives/ - channel_id/pmessage_id + channel_id/p + message_id
Organization: subdomain used in Slack diff --git a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx index b8f7b380c16..c3c322a293c 100644 --- a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx +++ b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx @@ -40,7 +40,10 @@ This time, we're switching things around: Now I've just got to pry it away from Peanut 🥜 😂 pic.twitter.com/POBdVZrF5N

- — Daniel Cranney 🇬🇧 (@danielcranney) August 10, 2022 + — Daniel Cranney 🇬🇧 (@danielcranney){' '} + + August 10, 2022 + diff --git a/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx b/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx index c6fa7976886..a1e333b5e87 100644 --- a/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx +++ b/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx @@ -626,7 +626,8 @@ ion-content { --padding-top: 20%; --padding-start: 5%; --padding-end: 5%; - --background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), + --background: + linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), url('https://images.unsplash.com/photo-1508964942454-1a56651d54ac?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1035&q=80') no-repeat; } @@ -792,7 +793,8 @@ ion-content { --padding-top: 20%; --padding-start: 5%; --padding-end: 5%; - --background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), + --background: + linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), url('https://images.unsplash.com/photo-1508964942454-1a56651d54ac?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1035&q=80') no-repeat; } diff --git a/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx b/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx index 025984eabb5..6dab3b93107 100644 --- a/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx +++ b/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx @@ -38,12 +38,10 @@ If you want to dive a little deeper, here are a few good resources we found to g href="https://www.youtube.com/watch?v=DPl34H2ISsk" target="_blank" children="I wish I knew this before using React Three Fiber" - /> - from our very own -- - by + - from our very own +- - by + ## Setting up the scene diff --git a/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx b/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx index dfa9d446529..3d3d4f91658 100644 --- a/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx +++ b/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx @@ -119,8 +119,12 @@ Thanks to everyone who participated. I hope you enjoyed it, and a massive thank @KyleRummens.{' '} pic.twitter.com/Uzk4q3aJyy

- — Tristan Rhodes (@tristanbob) April 19, 2024 - + — Tristan Rhodes (@tristanbob){' '} + + April 19, 2024 + + + + — Dherrbie (@Debbyiecodes){' '} + + April 20, 2024 + + + ## Contributing to open source diff --git a/apps/www/_blog/2024-12-04-supabase-cron.mdx b/apps/www/_blog/2024-12-04-supabase-cron.mdx index d577acf6234..1c48baf94a6 100644 --- a/apps/www/_blog/2024-12-04-supabase-cron.mdx +++ b/apps/www/_blog/2024-12-04-supabase-cron.mdx @@ -121,7 +121,8 @@ Wondering why a Job failed? You can view the history of all Jobs and their logs alt="Observe and debug Jobs" src="/images/blog/launch-week-13/day-3-supabase-cron/history.jpg" /> -For a deeper dive, you can view Jobs in the [Logs Explorer](https://supabase.com/dashboard/project/_zvmkyvanngopzqaabmvx_/logs/pgcron-logs). +For a deeper dive, you can view Jobs in the [Logs +Explorer](https://supabase.com/dashboard/project/_zvmkyvanngopzqaabmvx_/logs/pgcron-logs). View cron logs ### Try Supabase Cron today diff --git a/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx b/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx index 842aa5a2436..9af6d5e33ba 100644 --- a/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx +++ b/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx @@ -273,7 +273,6 @@ values (1, 2, 'same_category', 5), -- "Intro to Graph Theory" and "Advanced Graph Algorithms" are in the same category (2, 3, 'watched_by_same_users', 3), -- "Advanced Graph Algorithms" and "Graph Neural Networks" are often watched together (4, 5, 'same_category', 5); -- "Beginner Python Tutorial - create table interactions ( user_id int references auth.users (id), video_id int references videos (id), diff --git a/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx b/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx index b7c8d089f08..657c2697d6c 100644 --- a/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx +++ b/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx @@ -135,5 +135,7 @@ Finally, we want to give a special shout out to the [Zero Sync](https://zero.roc --- [^1]: This is so the event trigger can be altered or dropped by end users. + [^2]: This is not true if you mark the event trigger function as `security definer`, then it will run with the privileges of the function owner. But this is not a usual practice on event triggers, as they usually want to preserve the context of the current user. + [^3]: These are configurable. You can read more about reserved roles [here](https://supabase.com/blog/roles-postgres-hooks). diff --git a/apps/www/app/api-v2/ticket-og/route.tsx b/apps/www/app/api-v2/ticket-og/route.tsx index 46b216f66f4..d3f62abbd6a 100644 --- a/apps/www/app/api-v2/ticket-og/route.tsx +++ b/apps/www/app/api-v2/ticket-og/route.tsx @@ -109,91 +109,90 @@ export async function GET(req: Request) { const TICKET_BOTTOM_TEXT_FONT_SIZE = 20 const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + + {/* LINEAR GRADIENT */}
+ + {/* LEFT */} +
- {/* Background */} - - - {/* LINEAR GRADIENT */} -
- - {/* LEFT */} -
-
-

- Launch Week 15 -

- {/* + {/* */} -
-
-

- July 14—18 -

- -
- - {/* TICKET */}
+

+ July 14—18 +

+ +
+
+ + {/* TICKET */} +
+
-
+
+ +
- -
-
-
-

- LW -

-

- 15 -

-
+ LW +

+

+ 15 +

-
+
+

+ @{username} +

+

- @{username} + Company

-
-

- Company -

-

- {metadata.company ?? '—'} -

-
- {/*
+
+ {/*
*/} -
- - ), +
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/components/Carousels/ImageCarousel.module.css b/apps/www/components/Carousels/ImageCarousel.module.css index 5a8c40ab2af..de0465a8225 100644 --- a/apps/www/components/Carousels/ImageCarousel.module.css +++ b/apps/www/components/Carousels/ImageCarousel.module.css @@ -1,6 +1,7 @@ /* bright */ .gradient-bg { - background: linear-gradient(338.96deg, rgba(0, 0, 0, 0.2) -18.99%, rgba(0, 0, 0, 0) 25.34%), + background: + linear-gradient(338.96deg, rgba(0, 0, 0, 0.2) -18.99%, rgba(0, 0, 0, 0) 25.34%), linear-gradient(300.08deg, #53ffb1 7.6%, #3ecf8e 64.93%); /* transform: rotate(-89.79deg); */ } diff --git a/apps/www/components/Events/EventListItem.tsx b/apps/www/components/Events/EventListItem.tsx index 84765051721..ca2a802d8b3 100644 --- a/apps/www/components/Events/EventListItem.tsx +++ b/apps/www/components/Events/EventListItem.tsx @@ -34,8 +34,8 @@ const EventListItem = ({ event }: Props) => { return (
diff --git a/apps/www/components/ImageModal.tsx b/apps/www/components/ImageModal.tsx index fab5a4d8207..a2945ca7048 100644 --- a/apps/www/components/ImageModal.tsx +++ b/apps/www/components/ImageModal.tsx @@ -7,7 +7,8 @@ import styleHandler from 'ui/src/lib/theme/styleHandler' export type ImageModalProps = RadixProps & Props interface RadixProps - extends Dialog.DialogProps, + extends + Dialog.DialogProps, Pick< Dialog.DialogContentProps, | 'onOpenAutoFocus' diff --git a/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css b/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css index c81740ed399..aaab08cb7ca 100644 --- a/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css +++ b/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css @@ -1,6 +1,7 @@ /* mask overlay on left & right */ .brick-wall-mask--left, .brick-wall-mask--right { - background: linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%), + background: + linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%), linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%); } diff --git a/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css b/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css index 04776532987..ecfab8e8209 100644 --- a/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css +++ b/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css @@ -1,5 +1,13 @@ .gradient-overlay::before { - background: linear-gradient(0deg, #1c1c1c 0%, #1c1c1c20 60%, transparent 100%), - linear-gradient(0deg, #1c1c1c 0%, #1c1c1c80 20%, #1c1c1c60 40%, #1c1c1c05 75%, transparent 100%), + background: + linear-gradient(0deg, #1c1c1c 0%, #1c1c1c20 60%, transparent 100%), + linear-gradient( + 0deg, + #1c1c1c 0%, + #1c1c1c80 20%, + #1c1c1c60 40%, + #1c1c1c05 75%, + transparent 100% + ), linear-gradient(0deg, #1c1c1c 0%, #1c1c1c80 15%, #1c1c1c50 40%, #1c1c1c05 65%, transparent 100%); } diff --git a/apps/www/components/Sections/TimedAccordionSection.tsx b/apps/www/components/Sections/TimedAccordionSection.tsx index 178835e1a7b..850abc65d63 100644 --- a/apps/www/components/Sections/TimedAccordionSection.tsx +++ b/apps/www/components/Sections/TimedAccordionSection.tsx @@ -20,7 +20,7 @@ const Tab = ({ isActive, label, paragraph, onClick, progress, intervalDuration } const [height, setHeight] = useState('auto') useEffect(() => { if (!paragraphRef) return - setHeight(isActive ? paragraphRef.current?.clientHeight ?? 0 : 0) + setHeight(isActive ? (paragraphRef.current?.clientHeight ?? 0) : 0) }, [isActive]) return ( diff --git a/apps/www/components/Solutions/PlatformSection.tsx b/apps/www/components/Solutions/PlatformSection.tsx index ca30a873a17..8fc49403fd8 100644 --- a/apps/www/components/Solutions/PlatformSection.tsx +++ b/apps/www/components/Solutions/PlatformSection.tsx @@ -33,7 +33,9 @@ const PlatformSection = ({ title, subheading, features, id, className }: Platfor
- {features?.map((feature) => )} + {features?.map((feature) => ( + + ))}
) diff --git a/apps/www/components/VideoWithHighlights.tsx b/apps/www/components/VideoWithHighlights.tsx index 1cef1f2aa75..5b986f88b6b 100644 --- a/apps/www/components/VideoWithHighlights.tsx +++ b/apps/www/components/VideoWithHighlights.tsx @@ -38,7 +38,7 @@ const VideoWithHighlights = (props: Props) => { ))} diff --git a/apps/www/styles/customers.module.css b/apps/www/styles/customers.module.css index 5c85f6cd587..43f205e683c 100644 --- a/apps/www/styles/customers.module.css +++ b/apps/www/styles/customers.module.css @@ -5,8 +5,8 @@ radial-gradient(80% 100% at 50% 75%, #3ecf8e10 0%, #0d0e1200 100%), radial-gradient(40% 70% at 50% 80%, #3ecf8e20 0%, #3ecf8e00 100%), /* radial-gradient(100% 100% at 50% 80%, #1c1c1c50 0%, #3ecf8e00 100%), */ - /* Stars from left to right =================================== */ - radial-gradient(1px 1px at 5% 25%, #3ecf8e70 0%, #3ecf8e00 100%), + /* Stars from left to right =================================== */ + radial-gradient(1px 1px at 5% 25%, #3ecf8e70 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 14% 15%, #3ecf8e 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 19% 35%, #3ecf8e 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 29% 10%, #3ecf8e 0%, #3ecf8e00 100%), diff --git a/apps/www/supabase/functions/lw11-og/handler.tsx b/apps/www/supabase/functions/lw11-og/handler.tsx index e036659fb0b..a55406a926c 100644 --- a/apps/www/supabase/functions/lw11-og/handler.tsx +++ b/apps/www/supabase/functions/lw11-og/handler.tsx @@ -142,235 +142,233 @@ export async function handler(req: Request) { } const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + {/* Ticket */}
- {/* Background */} - {/* Ticket */} -
- + src={BACKGROUND[ticketType].BG} + /> - {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

- - {/* Name & username */} -
- {HAS_AVATAR && ( - - )} -

- {DISPLAY_NAME} -

- -
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
-
- -
+ {`NO ${prefix}${ticketNumber}`} +

+ + {/* Name & username */} +
+ {HAS_AVATAR && ( + + )} +

+ {DISPLAY_NAME} +

+
- -
- -

- - Join us for a - - - Special Announcement - -

-

- April 15-19 / 7AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} +
- - ), + +
+
+ +
+ +

+ + Join us for a + + + Special Announcement + +

+

+ April 15-19 / 7AM PT +

+
+
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/supabase/functions/lwx-og/handler.tsx b/apps/www/supabase/functions/lwx-og/handler.tsx index b4eea3fbcb1..bd34330ff3e 100644 --- a/apps/www/supabase/functions/lwx-og/handler.tsx +++ b/apps/www/supabase/functions/lwx-og/handler.tsx @@ -126,152 +126,150 @@ export async function handler(req: Request) { const OG_PADDING_Y = (OG_HEIGHT - TICKET_HEIGHT) / 2 const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + {/* Ticket */} + + + {/* Name & username */}
- {/* Background */} - - {/* Ticket */} - - - {/* Name & username */} -
-

- {name ?? username} -

+ {name ?? username} +

-
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
-
- -
- {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

-

- Launch Week X -

-

- DEC 11-15 / 8AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `}
- - ), +
+
+ +
+ {/* Ticket No */} +

+ {`NO ${prefix}${ticketNumber}`} +

+

+ Launch Week X +

+

+ DEC 11-15 / 8AM PT +

+
+
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/supabase/functions/lwx-ticket-og/handler.tsx b/apps/www/supabase/functions/lwx-ticket-og/handler.tsx index 207d7ac5495..3dbfce0e051 100644 --- a/apps/www/supabase/functions/lwx-ticket-og/handler.tsx +++ b/apps/www/supabase/functions/lwx-ticket-og/handler.tsx @@ -34,35 +34,33 @@ export async function handler(req: Request) { } const geneartedOGImage = new ImageResponse( - ( -
+ {/* Ticket */} + - {/* Ticket */} - -
- ), + /> +
, { width: 1200, height: 628, diff --git a/apps/www/supabase/functions/lwx-ticket/handler.tsx b/apps/www/supabase/functions/lwx-ticket/handler.tsx index 72bf3ff3fa6..004c4967d47 100644 --- a/apps/www/supabase/functions/lwx-ticket/handler.tsx +++ b/apps/www/supabase/functions/lwx-ticket/handler.tsx @@ -109,136 +109,134 @@ export async function handler(req: Request) { const HAS_NO_META = !HAS_ROLE && !HAS_COMPANY && !HAS_LOCATION const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + + {/* Name & username */}
- {/* Background */} - - - {/* Name & username */} -
-

- {name ?? username} -

+ {name ?? username} +

- {/* Username */} -
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
+ {/* Username */}
-
- -
- {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

-

- Launch Week X -

-

- DEC 11-15 / 8AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `}
- - ), +
+
+ +
+ {/* Ticket No */} +

+ {`NO ${prefix}${ticketNumber}`} +

+

+ Launch Week X +

+

+ DEC 11-15 / 8AM PT +

+
+
+ , { width: 1200, height: 628, diff --git a/package.json b/package.json index ce4526ea7ef..d50e829bd90 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dev:design-system": "turbo run dev --filter=design-system --parallel", "lint": "turbo run lint", "typecheck": "turbo --continue typecheck", - "test:prettier": "SORT_IMPORTS=false prettier --cache --check '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,json}'", + "test:prettier": "SORT_IMPORTS=false prettier --cache --check '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", "format": "SORT_IMPORTS=false prettier --cache --write '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", "test:docs": "turbo run test --filter=docs", "test:ui": "turbo run test --filter=ui", @@ -48,8 +48,8 @@ "@types/node": "catalog:", "eslint": "^9.0.0", "jsdom": "^28.1.0", - "prettier": "3.2.4", - "prettier-plugin-sql-cst": "^0.11.0", + "prettier": "3.7.3", + "prettier-plugin-sql-cst": "^0.18.0", "rimraf": "^6.0.0", "sass": "^1.72.0", "supabase": "^2.76.10", @@ -68,13 +68,6 @@ "pnpm": "10.24", "node": ">=22" }, - "keywords": [ - "postgres", - "firebase", - "storage", - "functions", - "database", - "auth" - ], + "keywords": ["postgres", "firebase", "storage", "functions", "database", "auth"], "packageManager": "pnpm@10.24.0" } diff --git a/packages/api-types/package.json b/packages/api-types/package.json index fc13f2be215..6674869602b 100644 --- a/packages/api-types/package.json +++ b/packages/api-types/package.json @@ -13,7 +13,7 @@ "license": "MIT", "devDependencies": { "openapi-typescript": "^7.4.3", - "prettier": "3.2.4", + "prettier": "*", "typescript": "catalog:" } } diff --git a/packages/build-icons/package.json b/packages/build-icons/package.json index d05f8af79de..7a789e0a0c1 100644 --- a/packages/build-icons/package.json +++ b/packages/build-icons/package.json @@ -20,7 +20,6 @@ "license": "ISC", "devDependencies": { "minimist": "^1.2.7", - "prettier": "3.2.4", "svgson": "^5.2.1" } } diff --git a/packages/common/feature-flags.tsx b/packages/common/feature-flags.tsx index 08382c3a507..fd8bfe9d7b9 100644 --- a/packages/common/feature-flags.tsx +++ b/packages/common/feature-flags.tsx @@ -210,7 +210,7 @@ export const FeatureFlagProvider = ({ flagValues.forEach((item) => { flagStore['configcat'][item.settingKey] = overridesCookieValue[item.settingKey] ?? - (item.settingValue === null ? null : item.settingValue ?? false) + (item.settingValue === null ? null : (item.settingValue ?? false)) }) } diff --git a/packages/pg-meta/src/sql/studio/auth/get-users-common.ts b/packages/pg-meta/src/sql/studio/auth/get-users-common.ts index c7255a77a67..3cae978ec11 100644 --- a/packages/pg-meta/src/sql/studio/auth/get-users-common.ts +++ b/packages/pg-meta/src/sql/studio/auth/get-users-common.ts @@ -1,7 +1,7 @@ export function prefixToUUID(prefix: string, max: boolean) { const mapped = '00000000-0000-0000-0000-000000000000' .split('') - .map((c, i) => (c === '-' ? c : prefix[i] ?? c)) + .map((c, i) => (c === '-' ? c : (prefix[i] ?? c))) if (prefix.length >= mapped.length) { return mapped.join('') diff --git a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx index ccfd8485ade..b95666809cf 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx @@ -114,8 +114,8 @@ export const ChartBar = ({ const yAxisConfig = { tick: showYAxis, hide: !showYAxis, - tickMargin: showYAxis ? YAxisProps?.tickMargin ?? 4 : 0, - width: showYAxis ? YAxisProps?.width ?? undefined : 0, + tickMargin: showYAxis ? (YAxisProps?.tickMargin ?? 4) : 0, + width: showYAxis ? (YAxisProps?.width ?? undefined) : 0, axisLine: { stroke: CHART_COLORS.AXIS }, tickLine: { stroke: CHART_COLORS.AXIS }, ...YAxisProps, diff --git a/packages/ui-patterns/src/Chart/charts/chart-line.tsx b/packages/ui-patterns/src/Chart/charts/chart-line.tsx index da1f193cf6a..2fc044ab7fe 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-line.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-line.tsx @@ -120,8 +120,8 @@ export const ChartLine = ({ const yAxisConfig = { tick: showYAxis, hide: !showYAxis, - tickMargin: showYAxis ? YAxisProps?.tickMargin ?? 4 : 0, - width: showYAxis ? YAxisProps?.width ?? undefined : 0, + tickMargin: showYAxis ? (YAxisProps?.tickMargin ?? 4) : 0, + width: showYAxis ? (YAxisProps?.width ?? undefined) : 0, axisLine: { stroke: CHART_COLORS.AXIS }, tickLine: { stroke: CHART_COLORS.AXIS }, ...YAxisProps, diff --git a/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx b/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx index aa8ecddd79d..9b2aeaa2bd6 100644 --- a/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx +++ b/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx @@ -9,8 +9,9 @@ import { import { useQuery } from './hooks/queryHooks' -interface TextHighlighterBaseProps - extends PropsWithChildren, HTMLSpanElement>> { +interface TextHighlighterBaseProps extends PropsWithChildren< + DetailedHTMLProps, HTMLSpanElement> +> { query: string text?: string } diff --git a/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx b/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx index c8aafb2f856..af2d06c8955 100644 --- a/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx +++ b/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx @@ -10,8 +10,7 @@ import { alertVariants } from '../shadcn/ui/alert' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../shadcn/ui/collapsible' export interface AlertCollapsibleProps - extends Omit, 'title'>, - VariantProps { + extends Omit, 'title'>, VariantProps { trigger: React.ReactNode defaultOpen?: boolean } diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 05ad140b658..b97c71e9af2 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -208,7 +208,8 @@ const loadingVariants = cva('', { export interface ButtonProps // omit `type` as we use it to change type of button // replaced with `htmlType` - extends Omit, 'type'>, + extends + Omit, 'type'>, // omit 'disabled' as it is included in HTMLButtonElement Omit, Omit { diff --git a/packages/ui/src/components/Input/Input.tsx b/packages/ui/src/components/Input/Input.tsx index 70091f0e4b8..ec30cdcaf42 100644 --- a/packages/ui/src/components/Input/Input.tsx +++ b/packages/ui/src/components/Input/Input.tsx @@ -13,8 +13,10 @@ import { cn } from '../../lib/utils/cn' import { Button } from '../Button' import { useFormContext } from '../Form/FormContext' -export interface Props - extends Omit, 'size' | 'onCopy'> { +export interface Props extends Omit< + React.InputHTMLAttributes, + 'size' | 'onCopy' +> { inputClassName?: string iconContainerClassName?: string copy?: boolean @@ -196,8 +198,10 @@ function Input({ /** * @deprecated Use ./TextArea_Shadcn_ instead */ -export interface TextAreaProps - extends Omit, 'size' | 'onCopy'> { +export interface TextAreaProps extends Omit< + React.InputHTMLAttributes, + 'size' | 'onCopy' +> { textAreaClassName?: string descriptionText?: string | React.ReactNode | undefined error?: string diff --git a/packages/ui/src/components/Modal/Modal.tsx b/packages/ui/src/components/Modal/Modal.tsx index 0c1c0fe2574..f69afe220c2 100644 --- a/packages/ui/src/components/Modal/Modal.tsx +++ b/packages/ui/src/components/Modal/Modal.tsx @@ -55,10 +55,9 @@ export interface ModalProps extends React.ComponentProps { closable?: boolean } -interface ModalType - extends React.ForwardRefExoticComponent< - React.ComponentPropsWithoutRef & ModalProps - > { +interface ModalType extends React.ForwardRefExoticComponent< + React.ComponentPropsWithoutRef & ModalProps +> { Content: React.ComponentType<{ children: React.ReactNode; className?: string }> Separator: React.ComponentType } diff --git a/packages/ui/src/components/NavMenu/index.tsx b/packages/ui/src/components/NavMenu/index.tsx index d930eaa017c..8e31e46b764 100644 --- a/packages/ui/src/components/NavMenu/index.tsx +++ b/packages/ui/src/components/NavMenu/index.tsx @@ -21,11 +21,10 @@ export const NavMenu = forwardRef( } ) -interface NavMenuItemProps - extends PropsWithChildren<{ - className?: string - active: boolean - }> {} +interface NavMenuItemProps extends PropsWithChildren<{ + className?: string + active: boolean +}> {} export const NavMenuItem = forwardRef( ({ children, className, active, ...props }, ref) => ( diff --git a/packages/ui/src/components/SidePanel/SidePanel.tsx b/packages/ui/src/components/SidePanel/SidePanel.tsx index cde94fa4846..bdd82e5b41e 100644 --- a/packages/ui/src/components/SidePanel/SidePanel.tsx +++ b/packages/ui/src/components/SidePanel/SidePanel.tsx @@ -10,7 +10,8 @@ import styleHandler from '../../lib/theme/styleHandler' export type SidePanelProps = RadixProps & CustomProps interface RadixProps - extends Dialog.DialogProps, + extends + Dialog.DialogProps, Pick< Dialog.DialogContentProps, | 'onOpenAutoFocus' diff --git a/packages/ui/src/components/shadcn/ui/badge.tsx b/packages/ui/src/components/shadcn/ui/badge.tsx index 413ac13dbce..07372f921b7 100644 --- a/packages/ui/src/components/shadcn/ui/badge.tsx +++ b/packages/ui/src/components/shadcn/ui/badge.tsx @@ -25,8 +25,7 @@ const badgeVariants = cva( ) export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} + extends React.HTMLAttributes, VariantProps {} // Forward refs in order to allow tooltips to be applied to the badge const Badge = React.forwardRef( diff --git a/packages/ui/src/components/shadcn/ui/button.tsx b/packages/ui/src/components/shadcn/ui/button.tsx index 81e745911eb..3363e579196 100644 --- a/packages/ui/src/components/shadcn/ui/button.tsx +++ b/packages/ui/src/components/shadcn/ui/button.tsx @@ -33,8 +33,7 @@ const buttonVariants = cva( ) export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean } diff --git a/packages/ui/src/components/shadcn/ui/input.tsx b/packages/ui/src/components/shadcn/ui/input.tsx index 111e4edfb63..bb0630850da 100644 --- a/packages/ui/src/components/shadcn/ui/input.tsx +++ b/packages/ui/src/components/shadcn/ui/input.tsx @@ -5,7 +5,8 @@ import { SIZE_VARIANTS, SIZE_VARIANTS_DEFAULT } from '../../../lib/constants' import { cn } from '../../../lib/utils/cn' export interface InputProps - extends Omit, 'size'>, + extends + Omit, 'size'>, VariantProps {} export const InputVariants = cva( diff --git a/packages/ui/src/components/shadcn/ui/navigation-menu.tsx b/packages/ui/src/components/shadcn/ui/navigation-menu.tsx index 99e9b507821..35cb7bbd649 100644 --- a/packages/ui/src/components/shadcn/ui/navigation-menu.tsx +++ b/packages/ui/src/components/shadcn/ui/navigation-menu.tsx @@ -7,8 +7,9 @@ import * as React from 'react' import { cn } from '../../../lib/utils/cn' -interface NavigationMenuProps - extends React.ComponentPropsWithoutRef { +interface NavigationMenuProps extends React.ComponentPropsWithoutRef< + typeof NavigationMenuPrimitive.Root +> { viewportClassName?: string | undefined renderViewport?: boolean | undefined } diff --git a/packages/ui/src/components/shadcn/ui/sheet.tsx b/packages/ui/src/components/shadcn/ui/sheet.tsx index 7a1697cd853..c0f6fd70e7d 100644 --- a/packages/ui/src/components/shadcn/ui/sheet.tsx +++ b/packages/ui/src/components/shadcn/ui/sheet.tsx @@ -26,8 +26,7 @@ const portalVariants = cva('fixed inset-0 z-50 flex', { }) interface SheetPortalProps - extends SheetPrimitive.DialogPortalProps, - VariantProps {} + extends SheetPrimitive.DialogPortalProps, VariantProps {} const SheetPortal = ({ side, children, ...props }: SheetPortalProps) => ( {children} @@ -148,7 +147,8 @@ const sheetVariants = cva(classes, { }) export interface DialogContentProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps { showClose?: boolean hasOverlay?: boolean diff --git a/packages/ui/src/components/shadcn/ui/switch.tsx b/packages/ui/src/components/shadcn/ui/switch.tsx index dd53352d908..b0c1d23a5bc 100644 --- a/packages/ui/src/components/shadcn/ui/switch.tsx +++ b/packages/ui/src/components/shadcn/ui/switch.tsx @@ -42,7 +42,8 @@ const switchThumbVariants = cva( ) export interface SwitchProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps {} const Switch = React.forwardRef, SwitchProps>( diff --git a/packages/ui/src/lib/MarkdownSample.md b/packages/ui/src/lib/MarkdownSample.md index a37fd608d76..6756b7cc832 100644 --- a/packages/ui/src/lib/MarkdownSample.md +++ b/packages/ui/src/lib/MarkdownSample.md @@ -149,14 +149,12 @@ The most annoying thing about lists in Markdown is that `
  • ` elements aren't g - **For example, here's another nested list.** But this time with a second paragraph. - - These list items won't have `

    ` tags - Because they are only one line each - **But in this second top-level list item, they will.** This is especially annoying because of the spacing on this paragraph. - - As you can see here, because I've added a second line, this list item now has a `

    ` tag. This is the second line I'm talking about by the way. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aef97ed5057..f0e979d9d09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,7 +95,7 @@ importers: version: 3.823.0 '@ianvs/prettier-plugin-sort-imports': specifier: ^4.7.0 - version: 4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.2.4)(supports-color@8.1.1) + version: 4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.7.3)(supports-color@8.1.1) '@types/node': specifier: 'catalog:' version: 22.13.14 @@ -106,11 +106,11 @@ importers: specifier: ^28.1.0 version: 28.1.0(@noble/hashes@1.8.0)(supports-color@8.1.1) prettier: - specifier: 3.2.4 - version: 3.2.4 + specifier: 3.7.3 + version: 3.7.3 prettier-plugin-sql-cst: - specifier: ^0.11.0 - version: 0.11.1 + specifier: ^0.18.0 + version: 0.18.0 rimraf: specifier: ^6.0.0 version: 6.0.1 @@ -1258,9 +1258,6 @@ importers: postcss: specifier: ^8.5.3 version: 8.5.3 - prettier: - specifier: 3.2.4 - version: 3.2.4 raw-loader: specifier: ^4.0.2 version: 4.0.2(webpack@5.94.0) @@ -2017,8 +2014,8 @@ importers: specifier: ^7.4.3 version: 7.5.2(encoding@0.1.13)(typescript@5.9.2) prettier: - specifier: 3.2.4 - version: 3.2.4 + specifier: '*' + version: 3.7.3 typescript: specifier: 'catalog:' version: 5.9.2 @@ -2028,9 +2025,6 @@ importers: minimist: specifier: ^1.2.7 version: 1.2.8 - prettier: - specifier: 3.2.4 - version: 3.2.4 svgson: specifier: ^5.2.1 version: 5.3.1 @@ -15695,8 +15689,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-sql-cst@0.11.1: - resolution: {integrity: sha512-MZ8058LfIlNyGILQBeKE15PUTKGbP/QgflKcjkIl+JKgT4jiN6vecgfEhpMnhZLvopxX0xjuDyKM+/4mE0j6Ug==} + prettier-plugin-sql-cst@0.18.0: + resolution: {integrity: sha512-IEbKtlZ+H94uWFHQt4iKWMiJJRIuzWYw8jeLz+RCzy4bDtsM3/07GIF1+EFCbT9d0gWibTPotZWx8o3hz+ITeA==} prettier-plugin-sql@0.13.0: resolution: {integrity: sha512-Ui9603tDD6PFyr7JvIEoE6cIFMQnJVDriG+oLyVThsGo/MIl5ek18JhH3xtox9ux8jvyww/FUFrJzxpZ7FIdvw==} @@ -15709,16 +15703,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - prettier@3.7.3: resolution: {integrity: sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==} engines: {node: '>=14'} @@ -16997,8 +16981,8 @@ packages: resolution: {integrity: sha512-5vmt2HlCAVozxsBZuXWkAki/KGawaK+b5GG5x+BtXOFVpN/8cqppblFUxHl4jxdA0cvo14lABhM+KBnrUapOlw==} hasBin: true - sql-parser-cst@0.24.0: - resolution: {integrity: sha512-38NNWamo0PKv80Zn8r1iXgatkWEB04CPhun8nEQhEJlYBMSIV4OOt4g3diynjVHJSunNSQqAjKcwmhM0EeLCtg==} + sql-parser-cst@0.38.2: + resolution: {integrity: sha512-4SR3cZYMxG4gsmvZQSQYYzzfk20OnbpsnwOVbU6Fw39ORLPpIHCMqoX5li0dz+ZWyF5HeR+mSgbgayKhN4JR9w==} sql-template-strings@2.2.2: resolution: {integrity: sha512-UXhXR2869FQaD+GMly8jAMCRZ94nU5KcrFetZfWEMd+LVVG6y0ExgHAhatEcKZ/wk8YcKPdi+hiD2wm75lq3/Q==} @@ -21018,13 +21002,13 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@ianvs/prettier-plugin-sort-imports@4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.2.4)(supports-color@8.1.1)': + '@ianvs/prettier-plugin-sort-imports@4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.7.3)(supports-color@8.1.1)': dependencies: '@babel/generator': 7.29.0 '@babel/parser': 7.29.0 '@babel/traverse': 7.29.0(supports-color@8.1.1) '@babel/types': 7.29.0 - prettier: 3.2.4 + prettier: 3.7.3 semver: 7.7.3 optionalDependencies: '@vue/compiler-sfc': 3.5.21 @@ -25699,7 +25683,7 @@ snapshots: dependencies: '@babel/parser': 7.29.0 libpg-query: 15.2.0(encoding@0.1.13)(supports-color@8.1.1) - prettier: 3.2.5 + prettier: 3.7.3 transitivePeerDependencies: - encoding - supports-color @@ -34704,10 +34688,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-sql-cst@0.11.1: + prettier-plugin-sql-cst@0.18.0: dependencies: - prettier: 3.2.5 - sql-parser-cst: 0.24.0 + prettier: 3.7.3 + sql-parser-cst: 0.38.2 prettier-plugin-sql@0.13.0(prettier@2.8.8): dependencies: @@ -34718,10 +34702,6 @@ snapshots: prettier@2.8.8: {} - prettier@3.2.4: {} - - prettier@3.2.5: {} - prettier@3.7.3: {} pretty-bytes@7.0.1: {} @@ -36381,7 +36361,7 @@ snapshots: get-stdin: 8.0.0 nearley: 2.20.1 - sql-parser-cst@0.24.0: {} + sql-parser-cst@0.38.2: {} sql-template-strings@2.2.2: {} diff --git a/prettier.config.mjs b/prettier.config.mjs index 26d1ac4e645..2c42fb52245 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -6,6 +6,8 @@ let options = { printWidth: 100, endOfLine: 'lf', sqlKeywordCase: 'lower', + sqlLiteralCase: 'lower', + sqlTypeCase: 'lower', plugins: ['prettier-plugin-sql-cst'], overrides: [ {