From 03351c784ab03bb1b1997139758f0fe39e8917fa Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Wed, 25 Feb 2026 13:53:19 +0100 Subject: [PATCH 1/8] chore: split tests running from coveralls upload (#43171) this is so we can easily tell when tests failed vs when coveralls failed in the PR checks / github action breakdown. CleanShot 2026-02-25 at 11 28 00@2x --- .github/workflows/studio-unit-tests.yml | 31 +++++++++++-------- .github/workflows/ui-tests.yml | 30 +++++++++++------- .../interfaces/Reports/Reports.utils.test.ts | 1 + 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/.github/workflows/studio-unit-tests.yml b/.github/workflows/studio-unit-tests.yml index 5a162731feb4f..1fdf431f53876 100644 --- a/.github/workflows/studio-unit-tests.yml +++ b/.github/workflows/studio-unit-tests.yml @@ -55,24 +55,29 @@ jobs: NODE_OPTIONS: '--max_old_space_size=3072' run: pnpm run test:ci working-directory: ./apps/studio - - - name: Upload coverage results to Coveralls - uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 + - name: Upload coverage artifact + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: - parallel: true - flag-name: studio-tests - github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./apps/studio/coverage/lcov.info - base-path: './apps/studio' - fail-on-error: false + name: studio-coverage + path: ./apps/studio/coverage/lcov.info + retention-days: 1 - finish: + coveralls: needs: test - if: ${{ always() }} + if: ${{ always() && needs.test.result == 'success' }} + continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - - name: Coveralls Finished + - name: Download coverage artifact + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: studio-coverage + path: ./coverage + - name: Upload coverage results to Coveralls uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 with: - parallel-finished: true + flag-name: studio-tests github-token: ${{ secrets.GITHUB_TOKEN }} + path-to-lcov: ./coverage/lcov.info + base-path: './apps/studio' + fail-on-error: false diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index fc13c236d5caa..f9e1df7479e7f 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -44,23 +44,29 @@ jobs: - name: Run tests run: pnpm run test:ci working-directory: ./packages/ui - - - name: Upload coverage results to Coveralls - uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 + - name: Upload coverage artifact + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: - parallel: true - flag-name: ui-tests - github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./packages/ui/coverage/lcov.info - base-path: './packages/ui' + name: ui-coverage + path: ./packages/ui/coverage/lcov.info + retention-days: 1 - finish: + coveralls: needs: test - if: ${{ always() }} + if: ${{ always() && needs.test.result == 'success' }} + continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - - name: Coveralls Finished + - name: Download coverage artifact + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ui-coverage + path: ./coverage + - name: Upload coverage results to Coveralls uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 with: - parallel-finished: true + flag-name: ui-tests github-token: ${{ secrets.GITHUB_TOKEN }} + path-to-lcov: ./coverage/lcov.info + base-path: './packages/ui' + fail-on-error: false diff --git a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts index 8884c0e8a706b..8d40717116558 100644 --- a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts +++ b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts @@ -1,3 +1,4 @@ +// @see studio-unit-tests.yml import { describe, it, expect } from 'vitest' import { formatTimestamp } from './Reports.utils' import dayjs from 'dayjs' From 5b4bc14754f5fb6ca94262c18c65ea0576d64fed Mon Sep 17 00:00:00 2001 From: Andrew Valleteau Date: Wed, 25 Feb 2026 15:36:25 +0100 Subject: [PATCH 2/8] feat(branching): reduce default branching limit for pro account (#42872) - Add a warning about spend cap not applied on brahching when enabling github integration - Reduce default concurrent branches to avoid extra costs incurring Screenshot 2026-02-16 at 18 58 14 Fixes: DEVWF-1144 --- .../GitHubIntegrationConnectionForm.tsx | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx index df206af555bcc..218c82d9ca521 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx @@ -1,11 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ChevronDown, Loader2, PlusIcon, RefreshCw } from 'lucide-react' -import { useEffect, useMemo, useState } from 'react' -import { useForm } from 'react-hook-form' -import { toast } from 'sonner' -import * as z from 'zod' - import { IS_PLATFORM } from 'common' import { useBranchCreateMutation } from 'data/branches/branch-create-mutation' import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' @@ -20,9 +14,17 @@ import type { GitHubConnection } from 'data/integrations/integrations.types' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { DOCS_URL } from 'lib/constants' import { openInstallGitHubIntegrationWindow } from 'lib/github' import { EMPTY_ARR } from 'lib/void' +import { ChevronDown, Loader2, PlusIcon, RefreshCw } from 'lucide-react' +import { useEffect, useMemo, useState } from 'react' +import { useForm } from 'react-hook-form' +import { toast } from 'sonner' import { + Alert_Shadcn_, + AlertDescription_Shadcn_, + AlertTitle_Shadcn_, Button, Card, CardContent, @@ -44,8 +46,10 @@ import { PopoverTrigger_Shadcn_, Switch, } from 'ui' +import { InlineLink } from 'components/ui/InlineLink' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' const GITHUB_ICON = ( @@ -204,7 +208,7 @@ const GitHubIntegrationConnectionForm = ({ new_branch_per_pr: true, supabaseDirectory: '.', supabaseChangesOnly: true, - branchLimit: '50', + branchLimit: '3', }, }) @@ -343,7 +347,7 @@ const GitHubIntegrationConnectionForm = ({ new_branch_per_pr: true, supabaseDirectory: '.', supabaseChangesOnly: true, - branchLimit: '50', + branchLimit: '3', }) } catch (error) { console.error('Error removing integration:', error) @@ -626,6 +630,18 @@ const GitHubIntegrationConnectionForm = ({ + + Branching and billing + + Branching Compute is not covered by your organization's Spend Cap. Costs + should be closely monitored, as they may be incurred.{' '} + + Learn more + + + {/* Automatic Branching Section */}
Date: Wed, 25 Feb 2026 09:39:21 -0500 Subject: [PATCH 3/8] chore: update prose linter (#43147) --- .github/workflows/docs-lint-v2-scheduled.yml | 4 +- .github/workflows/docs-lint-v2.yml | 4 +- apps/docs/package.json | 2 +- pnpm-lock.yaml | 81 +++++++++++++++++++- pnpm-workspace.yaml | 2 +- 5 files changed, 85 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docs-lint-v2-scheduled.yml b/.github/workflows/docs-lint-v2-scheduled.yml index 8691af99ead30..24bf3db1d7ab6 100644 --- a/.github/workflows/docs-lint-v2-scheduled.yml +++ b/.github/workflows/docs-lint-v2-scheduled.yml @@ -31,10 +31,10 @@ jobs: ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ - key: 301e0d4b35f8f0c8553b4e93917b8b2685ef2627 + key: 6b08233ff8bca855f6a38246b2a8049332219188 - name: install linter if: steps.cache-cargo.outputs.cache-hit != 'true' - run: cargo install --locked --git https://github.com/supabase-community/supa-mdx-lint --rev 301e0d4b35f8f0c8553b4e93917b8b2685ef2627 + run: cargo install --locked --git https://github.com/supabase-community/supa-mdx-lint --rev 6b08233ff8bca855f6a38246b2a8049332219188 - name: run linter env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/docs-lint-v2.yml b/.github/workflows/docs-lint-v2.yml index 5555f3245cdd0..2d1315d9a8e5b 100644 --- a/.github/workflows/docs-lint-v2.yml +++ b/.github/workflows/docs-lint-v2.yml @@ -53,10 +53,10 @@ jobs: ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ - key: 301e0d4b35f8f0c8553b4e93917b8b2685ef2627 + key: 6b08233ff8bca855f6a38246b2a8049332219188 - name: install linter if: steps.filter.outputs.docs == 'true' && steps.cache-cargo.outputs.cache-hit != 'true' - run: cargo install --locked --git https://github.com/supabase-community/supa-mdx-lint --rev 301e0d4b35f8f0c8553b4e93917b8b2685ef2627 + run: cargo install --locked --git https://github.com/supabase-community/supa-mdx-lint --rev 6b08233ff8bca855f6a38246b2a8049332219188 - name: install reviewdog if: steps.filter.outputs.docs == 'true' uses: reviewdog/action-setup@3f401fe1d58fe77e10d665ab713057375e39b887 # v1.3.0 diff --git a/apps/docs/package.json b/apps/docs/package.json index 298f9686230a7..98acb87d8d3fa 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -128,7 +128,7 @@ "@graphql-codegen/cli": "5.0.5", "@graphql-codegen/typescript": "4.1.6", "@graphql-codegen/typescript-resolvers": "4.5.0", - "@supabase/supa-mdx-lint": "0.3.1", + "@supabase/supa-mdx-lint": "0.3.2", "@testing-library/react": "^16.0.0", "@types/common-tags": "^1.8.4", "@types/estree": "1.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d21c6a0c70d1e..1fdf57c8ef973 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -533,8 +533,8 @@ importers: specifier: 4.5.0 version: 4.5.0(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0) '@supabase/supa-mdx-lint': - specifier: 0.3.1 - version: 0.3.1 + specifier: 0.3.2 + version: 0.3.2 '@testing-library/react': specifier: ^16.0.0 version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8267,6 +8267,11 @@ packages: engines: {node: '>=10'} os: [darwin] + '@supabase/supa-mdx-lint-darwin@0.3.2': + resolution: {integrity: sha512-GGG0X1DiQLldkKIw8CDFQFYqK4aLgx6DIdzhOMwZrH34ADcE+WdExVnsHqaSE4eRwKsX531Hz+iJgiybWx1TBA==} + engines: {node: '>=10'} + os: [darwin] + '@supabase/supa-mdx-lint-linux-arm64@0.2.6-alpha': resolution: {integrity: sha512-y51H1VW4VIpsFB/ui8GEU1h15tPp9fL8p2NMDltNEUrjSYpH7hzbj+surxy/FA0JdXllpqNV+7UvDm/FIz/Klg==} engines: {node: '>=10'} @@ -8279,6 +8284,12 @@ packages: cpu: [arm64] os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-arm64@0.3.2': + resolution: {integrity: sha512-qRxTxZQBGc7uHVTH3mMAYilIgnZ7CvMQYeoJa5LbVhjAUmDjKwx5hTu1SoW2OyhkueMJcz887+Kynas2WO8ADw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-arm@0.2.6-alpha': resolution: {integrity: sha512-8UOMo8nRUDtaDuFjMlSjtaA6WjuZVRz5jRFFoFotm16QxA4+JMS00g6rmYl2nyt6Vjj/bCiFdS60oOWzPHFtBQ==} engines: {node: '>=10'} @@ -8291,6 +8302,12 @@ packages: cpu: [arm] os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-arm@0.3.2': + resolution: {integrity: sha512-KCCJ6iP6/s3SrbkvwWo/cjX6+LOp56C/mSM0NkVzaRpsc9VcN39/4gA1Ls7O2jOV/g2fnIEWfdRef6dY9ob+bA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-i686@0.2.6-alpha': resolution: {integrity: sha512-Vjcn3hGNsw4V9x6RpI9S75byeqlkHbkVNPtKihm4hof9hgaMoxEA+/EPX7f0L/1rnPR39dkV1rbBojoV/XBd6w==} engines: {node: '>=10'} @@ -8303,6 +8320,12 @@ packages: cpu: [x86, ia32] os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-i686@0.3.2': + resolution: {integrity: sha512-74J96VQzublrNAeNyVuymfBJM0teEWC4oCHVF6mdJ8sAJs4nGPv/QWG6aTFMzh2dvAlbS6jw4zlc0PoPluLCYg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-x64@0.2.6-alpha': resolution: {integrity: sha512-nq0GB/WaqKyt4LWvx1+Z7XboSIlWtKmmqxyG1OtTQPcgKrImHvGrOJ3GuoUEcpJ9JyByCb2Tj3BJ6zIV8ngIJQ==} engines: {node: '>=10'} @@ -8315,6 +8338,12 @@ packages: cpu: [x64] os: [linux, freebsd] + '@supabase/supa-mdx-lint-linux-x64@0.3.2': + resolution: {integrity: sha512-mort3Vc/LWNG9boV2QFnGHnPBWuKcNoOgkZXkjwqckAoMCpJ25dxVRmrGeQeP4MSiJSsw4+LTT0lfCegVgsr2w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + '@supabase/supa-mdx-lint-win32-i686@0.2.6-alpha': resolution: {integrity: sha512-htjCjhElGSt9LTrtFHtN+iCsVHa4fZmVBBQPsO6Tqsubis00voFInKXkQGDsMkT9swOyEBCAaYe7XK3FEnYEXA==} engines: {node: '>=10'} @@ -8327,6 +8356,12 @@ packages: cpu: [x86, ia32] os: [win32] + '@supabase/supa-mdx-lint-win32-i686@0.3.2': + resolution: {integrity: sha512-Fb2K/U2IpnoPQbXVSI51nG6Gd4C76SwXIs7RdAsXPgf1KTEh4R0YgzmBxqCVGL7flxPxmnMSM++QKDD9qqTslQ==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + '@supabase/supa-mdx-lint-win32-x64@0.2.6-alpha': resolution: {integrity: sha512-/hyZAA6SWMJsiPYeofN4NPkf6X/Fcywtls9I83PVFGYMaiK5jU2AvnjC22rMQSWgEFKKrF9K75yU7Qsd5teSpg==} engines: {node: '>=10'} @@ -8339,6 +8374,12 @@ packages: cpu: [x64] os: [win32] + '@supabase/supa-mdx-lint-win32-x64@0.3.2': + resolution: {integrity: sha512-3Bt4JVD1wwnDFrXoSZ1srV29w4RBWV5B5UITlG4EXBbpmOFDHbgH0nUbf65tSPzNEVIcwaW+5iFzwSi69gAbsA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + '@supabase/supa-mdx-lint@0.2.6-alpha': resolution: {integrity: sha512-rfp+xsnTaQ/UB5LNNZEh6w00JxxkZMoZnjjIgb/TBvqr/E1DbWyLHSyWwMD8sBoC+LX8q20ym75GRAXhvxIONA==} hasBin: true @@ -8347,6 +8388,10 @@ packages: resolution: {integrity: sha512-TNbBLSofM6jQg3JwzO4lttd59dScTTzW4p504/OWcgRWghQLRNfxXRJJtdui83gBMLWpgeUZqvgtfYIwS1Flzw==} hasBin: true + '@supabase/supa-mdx-lint@0.3.2': + resolution: {integrity: sha512-iqJHDk/ToyxFMa/um9A5gsp9jYN7iI0cIabNq9nyBpK/Yat/J9I2IIMueQwIMy3TsG6a2qdPyUkZkuPC37SdRg==} + hasBin: true + '@supabase/supabase-js@2.97.1-canary.3': resolution: {integrity: sha512-fpZT3obVxsNvjdBEYeGqcGDaF9XsNYuGN9bKFt4Ooqwhe97y9tpf72sswqiRzuFRmgxmZ1dFnAMiFveTeoQDwQ==} engines: {node: '>=20.0.0'} @@ -25577,42 +25622,63 @@ snapshots: '@supabase/supa-mdx-lint-darwin@0.3.1': optional: true + '@supabase/supa-mdx-lint-darwin@0.3.2': + optional: true + '@supabase/supa-mdx-lint-linux-arm64@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-linux-arm64@0.3.1': optional: true + '@supabase/supa-mdx-lint-linux-arm64@0.3.2': + optional: true + '@supabase/supa-mdx-lint-linux-arm@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-linux-arm@0.3.1': optional: true + '@supabase/supa-mdx-lint-linux-arm@0.3.2': + optional: true + '@supabase/supa-mdx-lint-linux-i686@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-linux-i686@0.3.1': optional: true + '@supabase/supa-mdx-lint-linux-i686@0.3.2': + optional: true + '@supabase/supa-mdx-lint-linux-x64@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-linux-x64@0.3.1': optional: true + '@supabase/supa-mdx-lint-linux-x64@0.3.2': + optional: true + '@supabase/supa-mdx-lint-win32-i686@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-win32-i686@0.3.1': optional: true + '@supabase/supa-mdx-lint-win32-i686@0.3.2': + optional: true + '@supabase/supa-mdx-lint-win32-x64@0.2.6-alpha': optional: true '@supabase/supa-mdx-lint-win32-x64@0.3.1': optional: true + '@supabase/supa-mdx-lint-win32-x64@0.3.2': + optional: true + '@supabase/supa-mdx-lint@0.2.6-alpha': optionalDependencies: '@supabase/supa-mdx-lint-darwin': 0.2.6-alpha @@ -25635,6 +25701,17 @@ snapshots: '@supabase/supa-mdx-lint-win32-x64': 0.3.1 node-pty: 1.0.0 + '@supabase/supa-mdx-lint@0.3.2': + optionalDependencies: + '@supabase/supa-mdx-lint-darwin': 0.3.2 + '@supabase/supa-mdx-lint-linux-arm': 0.3.2 + '@supabase/supa-mdx-lint-linux-arm64': 0.3.2 + '@supabase/supa-mdx-lint-linux-i686': 0.3.2 + '@supabase/supa-mdx-lint-linux-x64': 0.3.2 + '@supabase/supa-mdx-lint-win32-i686': 0.3.2 + '@supabase/supa-mdx-lint-win32-x64': 0.3.2 + node-pty: 1.0.0 + '@supabase/supabase-js@2.97.1-canary.3': dependencies: '@supabase/auth-js': 2.97.1-canary.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 70fc50f1d6b97..92e2730fc4334 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -36,7 +36,6 @@ ignoredBuiltDependencies: - esbuild - libpg-query - msw - - node-pty - protobufjs - sharp @@ -62,6 +61,7 @@ minimumReleaseAgeExclude: - react-resizable-panels onlyBuiltDependencies: + - node-pty - supabase overrides: From 26777710d22163210ff109416ccb6c44d62ccc4e Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:45:33 +0100 Subject: [PATCH 4/8] remove fail-on-error (#43175) Co-authored-by: Joshen Lim --- .github/workflows/studio-unit-tests.yml | 1 - .github/workflows/ui-tests.yml | 1 - apps/studio/components/interfaces/Reports/Reports.utils.test.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/.github/workflows/studio-unit-tests.yml b/.github/workflows/studio-unit-tests.yml index 1fdf431f53876..1f5ff88162ca3 100644 --- a/.github/workflows/studio-unit-tests.yml +++ b/.github/workflows/studio-unit-tests.yml @@ -80,4 +80,3 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./coverage/lcov.info base-path: './apps/studio' - fail-on-error: false diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index f9e1df7479e7f..a2ee1c9dd3153 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -69,4 +69,3 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./coverage/lcov.info base-path: './packages/ui' - fail-on-error: false diff --git a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts index 8d40717116558..8884c0e8a706b 100644 --- a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts +++ b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts @@ -1,4 +1,3 @@ -// @see studio-unit-tests.yml import { describe, it, expect } from 'vitest' import { formatTimestamp } from './Reports.utils' import dayjs from 'dayjs' From 9568584fccd074ac49212dcee129c3e117d72a9c Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 25 Feb 2026 23:20:23 +0800 Subject: [PATCH 5/8] Show last migration's name instead of timestamp in new home page (#43115) ## Context In the new project home page, we have a stat for "Last migration" which we're showing _when_ the last migration was applied. However: - The timestamp for the migration is derived from the "version" column of the migration (in the `supabase_migrations` table) which afaik is derived from the migration's file name - It'll be alright if the migration was generated via the CLI, but we can't really enforce the name of the migration file if say they were generated via AI, so this is technically a point of flakiness - Reckon that it's more value to show _what_ was the last migration rather than _when_ so opting to change the value here to show the name of the last migration instead ### Before image ### After image --- .../Database/Migrations/Migrations.tsx | 27 ++++++++++----- .../interfaces/HomeNew/ActivityStats.tsx | 33 +++++-------------- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index d8b1bd5a7a0d9..b69e049afc56a 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -1,6 +1,3 @@ -import { Search } from 'lucide-react' -import { useState } from 'react' - import { SupportCategories } from '@supabase/shared-types/out/constants' import { SupportLink } from 'components/interfaces/Support/SupportLink' import CodeEditor from 'components/ui/CodeEditor/CodeEditor' @@ -9,6 +6,8 @@ import { DatabaseMigration, useMigrationsQuery } from 'data/database/migrations- import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { DOCS_URL } from 'lib/constants' import { parseMigrationVersion } from 'lib/migration-utils' +import { Search } from 'lucide-react' +import { useState } from 'react' import { Button, Card, @@ -24,9 +23,10 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns' +import { Admonition, TimestampInfo } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { MigrationsEmptyState } from './MigrationsEmptyState' const Migrations = () => { @@ -119,9 +119,10 @@ const Migrations = () => { {migrations.length > 0 ? ( migrations.map((migration) => { const versionDayjs = parseMigrationVersion(migration.version) - const insertedAt = versionDayjs + const label = versionDayjs ? versionDayjs.format('DD MMM YYYY, HH:mm:ss') - : undefined + : 'Unknown' + const insertedAt = versionDayjs ? versionDayjs.toISOString() : undefined return ( @@ -133,9 +134,19 @@ const Migrations = () => { > {migration?.name ?? 'Name not available'} - + - {insertedAt ?? 'Unknown'} + + {!!insertedAt ? ( + + ) : ( +

Unknown

+ )} +
{!insertedAt && ( This migration was not generated via the{' '} diff --git a/apps/studio/components/interfaces/HomeNew/ActivityStats.tsx b/apps/studio/components/interfaces/HomeNew/ActivityStats.tsx index f48c89c90fe6d..a9b3da46e777d 100644 --- a/apps/studio/components/interfaces/HomeNew/ActivityStats.tsx +++ b/apps/studio/components/interfaces/HomeNew/ActivityStats.tsx @@ -5,13 +5,13 @@ import { useBackupsQuery } from 'data/database/backups-query' import { DatabaseMigration, useMigrationsQuery } from 'data/database/migrations-query' import dayjs from 'dayjs' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { parseMigrationVersion } from 'lib/migration-utils' import { Archive, Database, GitBranch } from 'lucide-react' import { useMemo } from 'react' import { cn, Skeleton } from 'ui' import { TimestampInfo } from 'ui-patterns' import { ServiceStatus } from './ServiceStatus' +import { EMPTY_ARR } from '@/lib/void' export const ActivityStats = () => { const { ref } = useParams() @@ -37,14 +37,16 @@ export const ActivityStats = () => { )[0] }, [branchesData]) - const { data: migrationsData, isPending: isLoadingMigrations } = useMigrationsQuery({ + const { data: migrationsData = EMPTY_ARR, isPending: isLoadingMigrations } = useMigrationsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const latestMigration = useMemo( - () => (migrationsData ?? [])[0], + () => migrationsData[0], [migrationsData] ) + const migrationLabelText = + migrationsData.length === 0 ? 'No migrations' : latestMigration?.name ?? 'Unknown' const { data: backupsData, isPending: isLoadingBackups } = useBackupsQuery({ projectRef: project?.ref, @@ -57,21 +59,6 @@ export const ActivityStats = () => { .sort((a, b) => new Date(b.inserted_at).valueOf() - new Date(a.inserted_at).valueOf())[0] }, [backupsData]) - const [versionLabel, versionTimestamp] = useMemo(() => { - const version = latestMigration?.version - - const versionDayjs = parseMigrationVersion(version) - if (versionDayjs) { - return [versionDayjs.fromNow(), versionDayjs.toISOString()] - } - - return [undefined, undefined] - }, [latestMigration]) - - const hasValidVersion = versionLabel && versionTimestamp - - const versionLabelText = migrationsData && migrationsData.length > 0 ? 'Unknown' : 'No migrations' - return (
@@ -88,14 +75,10 @@ export const ActivityStats = () => { value={ isLoadingMigrations ? ( - ) : hasValidVersion ? ( - ) : ( -

{versionLabelText}

+

+ {migrationLabelText} +

) } /> From e87fea16816153fbd039d6afeaefc3d0f73b8915 Mon Sep 17 00:00:00 2001 From: "kemal.earth" <606977+kemaldotearth@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:35:48 +0000 Subject: [PATCH 6/8] fix(studio): table padding on auth overview tables (#43176) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Very smol fix. Think a recent fix to chart/card padding bodged it, easy fix for now. | Before | After | |--------|--------| | Screenshot 2026-02-25 at 14 08 33 | Screenshot 2026-02-25 at 14 08
55 | --- .../components/interfaces/Auth/Overview/OverviewMetrics.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx b/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx index b627da3e46cd1..a4e7b33dd3abe 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx @@ -289,7 +289,7 @@ export const OverviewMetrics = ({ metrics, isLoading, error }: OverviewMetricsPr Auth API Errors @@ -372,7 +372,7 @@ export const OverviewMetrics = ({ metrics, isLoading, error }: OverviewMetricsPr From a9a635722709ac77f03e4fd8d68b8d3fad7b16f1 Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:03:44 +0100 Subject: [PATCH 7/8] fix: tests workflow blocking non-studio/ui prs (#43185) --- .github/workflows/studio-unit-tests.yml | 19 +++++++++++++++---- .github/workflows/ui-tests.yml | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/.github/workflows/studio-unit-tests.yml b/.github/workflows/studio-unit-tests.yml index 1f5ff88162ca3..3c8db2064e9f6 100644 --- a/.github/workflows/studio-unit-tests.yml +++ b/.github/workflows/studio-unit-tests.yml @@ -11,9 +11,6 @@ on: - 'pnpm-lock.yaml' pull_request: branches: [master, studio] - paths: - - 'apps/studio/**' - - 'pnpm-lock.yaml' # Cancel old builds on new commit for same workflow + branch/PR concurrency: @@ -30,6 +27,8 @@ jobs: strategy: matrix: test_number: [1] + outputs: + tests_ran: ${{ steps.filter.outputs.relevant }} steps: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 @@ -37,25 +36,37 @@ jobs: sparse-checkout: | apps/studio packages + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: filter + with: + filters: | + relevant: + - 'apps/studio/**' + - 'pnpm-lock.yaml' - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + if: steps.filter.outputs.relevant == 'true' name: Install pnpm with: run_install: false - name: Use Node.js + if: steps.filter.outputs.relevant == 'true' uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version-file: '.nvmrc' cache: 'pnpm' - name: Install deps + if: steps.filter.outputs.relevant == 'true' run: pnpm install --frozen-lockfile working-directory: ./ - name: Run Tests + if: steps.filter.outputs.relevant == 'true' env: # Default is 2 GB, increase to have less frequent OOM errors NODE_OPTIONS: '--max_old_space_size=3072' run: pnpm run test:ci working-directory: ./apps/studio - name: Upload coverage artifact + if: steps.filter.outputs.relevant == 'true' uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: studio-coverage @@ -64,7 +75,7 @@ jobs: coveralls: needs: test - if: ${{ always() && needs.test.result == 'success' }} + if: ${{ always() && needs.test.result == 'success' && needs.test.outputs.tests_ran == 'true' }} continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index a2ee1c9dd3153..8d78237348cb4 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -3,8 +3,6 @@ name: UI Tests on: pull_request: branches: [master] - paths: - - 'packages/ui/**' # Cancel old builds on new commit for same workflow + branch/PR concurrency: @@ -20,31 +18,45 @@ jobs: strategy: matrix: test_number: [1] + outputs: + tests_ran: ${{ steps.filter.outputs.relevant }} steps: + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: filter + with: + filters: | + relevant: + - 'packages/ui/**' - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + if: steps.filter.outputs.relevant == 'true' with: sparse-checkout: | packages - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + if: steps.filter.outputs.relevant == 'true' name: Install pnpm with: run_install: false - name: Use Node.js + if: steps.filter.outputs.relevant == 'true' uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version-file: '.nvmrc' cache: 'pnpm' - name: Install deps + if: steps.filter.outputs.relevant == 'true' run: pnpm install --frozen-lockfile - name: Run tests + if: steps.filter.outputs.relevant == 'true' run: pnpm run test:ci working-directory: ./packages/ui - name: Upload coverage artifact + if: steps.filter.outputs.relevant == 'true' uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ui-coverage @@ -53,7 +65,7 @@ jobs: coveralls: needs: test - if: ${{ always() && needs.test.result == 'success' }} + if: ${{ always() && needs.test.result == 'success' && needs.test.outputs.tests_ran == 'true' }} continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: From 5d409bfd48fa95a91873c014eabd35efe170204c Mon Sep 17 00:00:00 2001 From: Alan Daniel Date: Wed, 25 Feb 2026 12:09:30 -0400 Subject: [PATCH 8/8] fixes for go bolt webginar page (#43180) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES/NO ## What kind of change does this PR introduce? Bug fix, feature, docs update, ... ## What is the current behavior? Please link any relevant issues here. ## What is the new behavior? Feel free to include screenshots if it includes visual changes. ## Additional context Add any other context or screenshots. Co-authored-by: Jordi Enric <37541088+jordienr@users.noreply.github.com> --- apps/www/_go/webinar/bolt-webinar.tsx | 3 ++- packages/marketing/src/go/actions/submitForm.ts | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/www/_go/webinar/bolt-webinar.tsx b/apps/www/_go/webinar/bolt-webinar.tsx index fe7f26a2ecff6..ff3e86091f2a3 100644 --- a/apps/www/_go/webinar/bolt-webinar.tsx +++ b/apps/www/_go/webinar/bolt-webinar.tsx @@ -81,6 +81,7 @@ const page: GoPageInput = { }, { type: 'form', + id: 'form', title: 'Tell us how we can help', description: 'Share your details and we’ll follow up with resources or a conversation.', fields: [ @@ -133,7 +134,7 @@ const page: GoPageInput = { first_name: 'firstname', last_name: 'lastname', email_address: 'email', - company_name: 'company', + company_name: 'name', message: 'what_are_you_currently_working_on_', }, consent: diff --git a/packages/marketing/src/go/actions/submitForm.ts b/packages/marketing/src/go/actions/submitForm.ts index f0a9ffdb3bacf..b44abfff91049 100644 --- a/packages/marketing/src/go/actions/submitForm.ts +++ b/packages/marketing/src/go/actions/submitForm.ts @@ -66,7 +66,12 @@ export async function submitFormAction( try { // Detect the email value from common field names const email = - values['email'] ?? values['workEmail'] ?? values['work_email'] ?? values['emailAddress'] ?? '' + values['email'] ?? + values['workEmail'] ?? + values['work_email'] ?? + values['emailAddress'] ?? + values['email_address'] ?? + '' if (!email) { debug('Submission rejected: no email field found in values')