Support Supabase branches (#1394)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds Supabase database branch selection per app, with a new schema field
and UI to choose a branch after connecting a project. Resets branch when
changing or disconnecting the project to keep state consistent.
- **New Features**
- Added apps.supabase_branch_id column.
- Branch dropdown in SupabaseConnector shown after a project is
connected; selection persists and triggers app refresh.
- New state and hooks: supabaseBranchesAtom, loadBranches(projectId),
setAppBranch(branchId).
- IPC endpoints: supabase:list-branches and supabase:set-app-branch;
setting/unsetting project also clears the branch.
- **Migration**
- Apply drizzle migration 0013_supabase_branch.sql to add the
supabase_branch_id column (defaults to null).
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Adds Supabase database branch selection per app, including parent
project tracking, new IPC endpoints, UI dropdown, and an accompanying DB
migration with e2e tests.
>
> - **Database**:
> - Add `apps.supabase_parent_project_id` via migration
`drizzle/0015_complete_old_lace.sql`; snapshot and journal updated.
> - **IPC/Main**:
> - New `supabase:list-branches` handler and management client
`listSupabaseBranches` (real API + test stubs).
> - Update `supabase:set-app-project` to accept `{ projectId,
parentProjectId?, appId }`; unset clears both IDs.
> - `get-app` resolves `supabaseProjectName` using
`supabase_parent_project_id` when present.
> - **Types & Client**:
> - Add `SupabaseBranch`, `SetSupabaseAppProjectParams`, and
`App.supabaseParentProjectId`; expose `listSupabaseBranches` and updated
`setSupabaseAppProject` in `ipc_client` and preload whitelist.
> - **UI/Hooks**:
> - Supabase UI: branch dropdown in `SupabaseConnector` with
`loadBranches`, selection persists via updated `setAppProject`.
> - State: add `supabaseBranchesAtom`; `useSupabase` gets `branches`,
`loadBranches`, new param shape for `setAppProject`.
> - TokenBar/ChatInput: add `data-testid` for token bar and toggle.
> - **Supabase Context (tests)**:
> - Test build returns large context for `test-branch-project-id` to
validate branch selection.
> - **E2E Tests**:
> - Add `supabase_branch.spec.ts` and snapshot verifying branch
selection affects token usage.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
33054278db8396b4371ed6e8224105cb5684b7ac. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
This commit is contained in:
@@ -168,6 +168,61 @@ export async function deleteSupabaseFunction({
|
||||
);
|
||||
}
|
||||
|
||||
export async function listSupabaseBranches({
|
||||
supabaseProjectId,
|
||||
}: {
|
||||
supabaseProjectId: string;
|
||||
}): Promise<
|
||||
Array<{
|
||||
id: string;
|
||||
name: string;
|
||||
is_default: boolean;
|
||||
project_ref: string;
|
||||
parent_project_ref: string;
|
||||
}>
|
||||
> {
|
||||
if (IS_TEST_BUILD) {
|
||||
return [
|
||||
{
|
||||
id: "default-branch-id",
|
||||
name: "Default Branch",
|
||||
is_default: true,
|
||||
project_ref: "fake-project-id",
|
||||
parent_project_ref: "fake-project-id",
|
||||
},
|
||||
|
||||
{
|
||||
id: "test-branch-id",
|
||||
name: "Test Branch",
|
||||
is_default: false,
|
||||
project_ref: "test-branch-project-id",
|
||||
parent_project_ref: "fake-project-id",
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
logger.info(`Listing Supabase branches for project: ${supabaseProjectId}`);
|
||||
const supabase = await getSupabaseClient();
|
||||
|
||||
const response = await fetch(
|
||||
`https://api.supabase.com/v1/projects/${supabaseProjectId}/branches`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: `Bearer ${(supabase as any).options.accessToken}`,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
if (response.status !== 200) {
|
||||
throw await createResponseError(response, "list branches");
|
||||
}
|
||||
|
||||
logger.info(`Listed Supabase branches for project: ${supabaseProjectId}`);
|
||||
const jsonResponse = await response.json();
|
||||
return jsonResponse;
|
||||
}
|
||||
|
||||
export async function deploySupabaseFunctions({
|
||||
supabaseProjectId,
|
||||
functionName,
|
||||
|
||||
Reference in New Issue
Block a user