Skip to content

Commit 918436a

Browse files
committed
feat: GCP handling in CLI (#2631)
Synced from monorepo@dd3da607cce506b5497c04ac07c44774e7954892
1 parent 5e84dc4 commit 918436a

4 files changed

Lines changed: 71 additions & 18 deletions

File tree

.sync-commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1da65b45fc9190b0ae85a8d80fb43e2891fdeab0
1+
dd3da607cce506b5497c04ac07c44774e7954892

src/commands/branch/create.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,13 @@ export async function implementation(this: LocalContext, flags: Flags) {
297297
}
298298

299299
if (!flags['parent-branch']) {
300-
flags['parent-branch'] = await this.getBranch(this, {}, { organizationId, projectId });
300+
const branches = await this.api.branches.listBranches({
301+
pathParams: { organizationID: organizationId, projectID: projectId }
302+
});
303+
flags['parent-branch'] = '';
304+
if (branches.branches.length > 0) {
305+
flags['parent-branch'] = await this.getBranch(this, {}, { organizationId, projectId });
306+
}
301307
}
302308

303309
const parentBranchId = flags['parent-branch'];

src/lib/cli-utils.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,32 @@ type Region = {
262262
id: string;
263263
publicAccess: boolean;
264264
backupsEnabled: boolean;
265+
provider: 'aws' | 'gcp' | 'custom';
265266
organizationId: string | null;
266267
};
267268

269+
const regionProviderLabels = {
270+
aws: 'AWS',
271+
gcp: 'GCP',
272+
custom: 'Custom'
273+
} satisfies Record<Region['provider'], string>;
274+
275+
const regionProviderColors = {
276+
aws: chalk.hex('#FF9900'),
277+
gcp: chalk.hex('#4285F4'),
278+
custom: chalk.gray
279+
} satisfies Record<Region['provider'], (text: string) => string>;
280+
281+
function formatRegionProvider(provider: Region['provider']) {
282+
const label = `(${regionProviderLabels[provider]})`;
283+
return regionProviderColors[provider](label);
284+
}
285+
286+
function formatRegionChoiceMessage(region: Region, group?: 'Organization' | 'Global') {
287+
const prefix = group ? `[${group}] ` : '';
288+
return `${prefix}${region.id} ${formatRegionProvider(region.provider)}`;
289+
}
290+
268291
export function groupAndSortRegions(regions: Region[]): { name: string; message: string }[] {
269292
const organizationRegions = regions.filter((r) => r.organizationId !== null);
270293
const globalRegions = regions.filter((r) => r.organizationId === null);
@@ -280,11 +303,11 @@ export function groupAndSortRegions(regions: Region[]): { name: string; message:
280303
return [
281304
...organizationRegions.map((region) => ({
282305
name: region.id,
283-
message: showGroups ? `[Organization] ${region.id}` : region.id
306+
message: formatRegionChoiceMessage(region, showGroups ? 'Organization' : undefined)
284307
})),
285308
...sortedGlobalRegions.map((region) => ({
286309
name: region.id,
287-
message: showGroups ? `[Global] ${region.id}` : region.id
310+
message: formatRegionChoiceMessage(region, showGroups ? 'Global' : undefined)
288311
}))
289312
];
290313
}

src/lib/cli-utils.unit.test.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type Region = {
77
id: string;
88
publicAccess: boolean;
99
backupsEnabled: boolean;
10+
provider: 'aws' | 'gcp' | 'custom';
1011
organizationId: string | null;
1112
};
1213

@@ -18,8 +19,12 @@ const normalizeTableOutput = (output: string) => {
1819
.map((line) => line.split(/\s+/));
1920
};
2021

21-
function createRegion(id: string, organizationId: string | null = null): Region {
22-
return { id, publicAccess: true, backupsEnabled: true, organizationId };
22+
function stripMessages(choices: { name: string; message: string }[]) {
23+
return choices.map((choice) => ({ ...choice, message: stripAnsi(choice.message) }));
24+
}
25+
26+
function createRegion(id: string, organizationId: string | null = null, provider: Region['provider'] = 'aws'): Region {
27+
return { id, publicAccess: true, backupsEnabled: true, provider, organizationId };
2328
}
2429

2530
describe('groupAndSortRegions', () => {
@@ -29,9 +34,20 @@ describe('groupAndSortRegions', () => {
2934

3035
const result = groupAndSortRegions(regions);
3136

32-
expect(result).toEqual([
33-
{ name: 'us-east-1', message: 'us-east-1' },
34-
{ name: 'eu-west-1', message: 'eu-west-1' }
37+
expect(stripMessages(result)).toEqual([
38+
{ name: 'us-east-1', message: 'us-east-1 (AWS)' },
39+
{ name: 'eu-west-1', message: 'eu-west-1 (AWS)' }
40+
]);
41+
});
42+
43+
it('should add cloud provider labels to region messages', () => {
44+
const regions = [createRegion('us-east-1', null, 'aws'), createRegion('europe-west1', null, 'gcp')];
45+
46+
const result = groupAndSortRegions(regions);
47+
48+
expect(stripMessages(result)).toEqual([
49+
{ name: 'us-east-1', message: 'us-east-1 (AWS)' },
50+
{ name: 'europe-west1', message: 'europe-west1 (GCP)' }
3551
]);
3652
});
3753

@@ -58,22 +74,30 @@ describe('groupAndSortRegions', () => {
5874

5975
const result = groupAndSortRegions(regions);
6076

61-
expect(result).toEqual([
62-
{ name: 'org-region-1', message: 'org-region-1' },
63-
{ name: 'org-region-2', message: 'org-region-2' }
77+
expect(stripMessages(result)).toEqual([
78+
{ name: 'org-region-1', message: 'org-region-1 (AWS)' },
79+
{ name: 'org-region-2', message: 'org-region-2 (AWS)' }
6480
]);
6581
});
82+
83+
it('should add custom provider labels to organization region messages', () => {
84+
const regions = [createRegion('org-region-1', 'org-123', 'custom')];
85+
86+
const result = groupAndSortRegions(regions);
87+
88+
expect(stripMessages(result)).toEqual([{ name: 'org-region-1', message: 'org-region-1 (Custom)' }]);
89+
});
6690
});
6791

6892
describe('with both global and organization regions', () => {
6993
it('should add group prefixes to messages', () => {
70-
const regions = [createRegion('us-east-1'), createRegion('org-region-1', 'org-123')];
94+
const regions = [createRegion('us-east-1'), createRegion('org-region-1', 'org-123', 'custom')];
7195

7296
const result = groupAndSortRegions(regions);
7397

74-
expect(result).toEqual([
75-
{ name: 'org-region-1', message: '[Organization] org-region-1' },
76-
{ name: 'us-east-1', message: '[Global] us-east-1' }
98+
expect(stripMessages(result)).toEqual([
99+
{ name: 'org-region-1', message: '[Organization] org-region-1 (Custom)' },
100+
{ name: 'us-east-1', message: '[Global] us-east-1 (AWS)' }
77101
]);
78102
});
79103

@@ -116,15 +140,15 @@ describe('groupAndSortRegions', () => {
116140

117141
const result = groupAndSortRegions(regions);
118142

119-
expect(result).toEqual([{ name: 'us-west-2', message: 'us-west-2' }]);
143+
expect(stripMessages(result)).toEqual([{ name: 'us-west-2', message: 'us-west-2 (AWS)' }]);
120144
});
121145

122146
it('should handle single organization region', () => {
123147
const regions = [createRegion('org-region-1', 'org-123')];
124148

125149
const result = groupAndSortRegions(regions);
126150

127-
expect(result).toEqual([{ name: 'org-region-1', message: 'org-region-1' }]);
151+
expect(stripMessages(result)).toEqual([{ name: 'org-region-1', message: 'org-region-1 (AWS)' }]);
128152
});
129153
});
130154
});

0 commit comments

Comments
 (0)