Skip to content

Commit c9e0044

Browse files
authored
Modify getStackOutputs to be more centralized describeStack (#196)
1 parent be61838 commit c9e0044

File tree

6 files changed

+56
-57
lines changed

6 files changed

+56
-57
lines changed

src/handlers/StackHandler.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
parseTemplateUriParams,
1717
parseGetStackEventsParams,
1818
parseClearStackEventsParams,
19-
parseGetStackOutputsParams,
19+
parseDescribeStackParams,
2020
} from '../stacks/actions/StackActionParser';
2121
import {
2222
TemplateUri,
@@ -42,8 +42,8 @@ import {
4242
GetStackEventsParams,
4343
GetStackEventsResult,
4444
ClearStackEventsParams,
45-
GetStackOutputsParams,
46-
GetStackOutputsResult,
45+
DescribeStackParams,
46+
DescribeStackResult,
4747
DescribeChangeSetParams,
4848
DescribeChangeSetResult,
4949
} from '../stacks/StackRequestType';
@@ -398,17 +398,17 @@ export function clearStackEventsHandler(
398398
};
399399
}
400400

401-
export function getStackOutputsHandler(
401+
export function describeStackHandler(
402402
components: ServerComponents,
403-
): RequestHandler<GetStackOutputsParams, GetStackOutputsResult, void> {
404-
return async (rawParams): Promise<GetStackOutputsResult> => {
403+
): RequestHandler<DescribeStackParams, DescribeStackResult, void> {
404+
return async (rawParams): Promise<DescribeStackResult> => {
405405
try {
406-
const params = parseWithPrettyError(parseGetStackOutputsParams, rawParams);
406+
const params = parseWithPrettyError(parseDescribeStackParams, rawParams);
407407
const response = await components.cfnService.describeStacks({ StackName: params.stackName });
408-
const outputs = response.Stacks?.[0]?.Outputs ?? [];
409-
return { outputs };
408+
const stack = response.Stacks?.[0];
409+
return { stack };
410410
} catch (error) {
411-
handleLspError(error, 'Failed to get stack outputs');
411+
handleLspError(error, 'Failed to describe stack');
412412
}
413413
};
414414
}

src/protocol/LspStackHandlers.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ import {
4545
GetStackEventsRequest,
4646
ClearStackEventsParams,
4747
ClearStackEventsRequest,
48-
GetStackOutputsParams,
49-
GetStackOutputsResult,
50-
GetStackOutputsRequest,
48+
DescribeStackParams,
49+
DescribeStackResult,
50+
DescribeStackRequest,
5151
DescribeChangeSetParams,
5252
DescribeChangeSetResult,
5353
DescribeChangeSetRequest,
@@ -133,7 +133,7 @@ export class LspStackHandlers {
133133
this.connection.onRequest(ClearStackEventsRequest.method, handler);
134134
}
135135

136-
onGetStackOutputs(handler: RequestHandler<GetStackOutputsParams, GetStackOutputsResult, void>) {
137-
this.connection.onRequest(GetStackOutputsRequest.method, handler);
136+
onDescribeStack(handler: RequestHandler<DescribeStackParams, DescribeStackResult, void>) {
137+
this.connection.onRequest(DescribeStackRequest.method, handler);
138138
}
139139
}

src/server/CfnServer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
describeChangeSetDeletionStatusHandler,
4545
getStackEventsHandler,
4646
clearStackEventsHandler,
47-
getStackOutputsHandler,
47+
describeStackHandler,
4848
describeChangeSetHandler,
4949
} from '../handlers/StackHandler';
5050
import { LspComponents } from '../protocol/LspComponents';
@@ -125,7 +125,7 @@ export class CfnServer {
125125
this.lsp.stackHandlers.onGetStackTemplate(getManagedResourceStackTemplateHandler(this.components));
126126
this.lsp.stackHandlers.onGetStackEvents(getStackEventsHandler(this.components));
127127
this.lsp.stackHandlers.onClearStackEvents(clearStackEventsHandler(this.components));
128-
this.lsp.stackHandlers.onGetStackOutputs(getStackOutputsHandler(this.components));
128+
this.lsp.stackHandlers.onDescribeStack(describeStackHandler(this.components));
129129

130130
this.lsp.environmentHandlers.onParseEnvironmentFiles(parseEnvironmentFilesHandler());
131131

src/stacks/StackRequestType.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { StackSummary, StackStatus, StackResourceSummary, StackEvent, Output } from '@aws-sdk/client-cloudformation';
1+
import { StackSummary, StackStatus, StackResourceSummary, StackEvent, Stack } from '@aws-sdk/client-cloudformation';
22
import { RequestType } from 'vscode-languageserver-protocol';
33
import { ChangeSetReference, StackChange } from './actions/StackActionRequestType';
44

@@ -95,16 +95,16 @@ export const ClearStackEventsRequest = new RequestType<ClearStackEventsParams, v
9595
'aws/cfn/stack/events/clear',
9696
);
9797

98-
export type GetStackOutputsParams = {
98+
export type DescribeStackParams = {
9999
stackName: string;
100100
};
101101

102-
export type GetStackOutputsResult = {
103-
outputs: Output[];
102+
export type DescribeStackResult = {
103+
stack?: Stack;
104104
};
105105

106-
export const GetStackOutputsRequest = new RequestType<GetStackOutputsParams, GetStackOutputsResult, void>(
107-
'aws/cfn/stack/outputs',
106+
export const DescribeStackRequest = new RequestType<DescribeStackParams, DescribeStackResult, void>(
107+
'aws/cfn/stack/describe',
108108
);
109109

110110
export const DescribeChangeSetRequest = new RequestType<DescribeChangeSetParams, DescribeChangeSetResult, void>(

src/stacks/actions/StackActionParser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ListStackResourcesParams,
55
GetStackEventsParams,
66
ClearStackEventsParams,
7-
GetStackOutputsParams,
7+
DescribeStackParams,
88
DescribeChangeSetParams,
99
} from '../StackRequestType';
1010
import {
@@ -89,7 +89,7 @@ const ClearStackEventsParamsSchema = z.object({
8989
stackName: z.string().min(1).max(128),
9090
});
9191

92-
const GetStackOutputsParamsSchema = z.object({
92+
const DescribeStackParamsSchema = z.object({
9393
stackName: z.string().min(1).max(128),
9494
});
9595

@@ -121,8 +121,8 @@ export function parseClearStackEventsParams(input: unknown): ClearStackEventsPar
121121
return ClearStackEventsParamsSchema.parse(input);
122122
}
123123

124-
export function parseGetStackOutputsParams(input: unknown): GetStackOutputsParams {
125-
return GetStackOutputsParamsSchema.parse(input);
124+
export function parseDescribeStackParams(input: unknown): DescribeStackParams {
125+
return DescribeStackParamsSchema.parse(input);
126126
}
127127

128128
export function parseDescribeChangeSetParams(input: unknown): DescribeChangeSetParams {

tst/unit/handlers/StackHandler.test.ts

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
deleteChangeSetHandler,
2929
describeChangeSetDeletionStatusHandler,
3030
getChangeSetDeletionStatusHandler,
31-
getStackOutputsHandler,
31+
describeStackHandler,
3232
describeChangeSetHandler,
3333
} from '../../../src/handlers/StackHandler';
3434
import { analyzeCapabilities } from '../../../src/stacks/actions/CapabilityAnalyzer';
@@ -45,7 +45,7 @@ import {
4545
ListStacksParams,
4646
ListStacksResult,
4747
ListStackResourcesResult,
48-
GetStackOutputsResult,
48+
DescribeStackResult,
4949
DescribeChangeSetParams,
5050
DescribeChangeSetResult,
5151
} from '../../../src/stacks/StackRequestType';
@@ -71,7 +71,7 @@ vi.mock('../../../src/stacks/actions/StackActionParser', () => ({
7171
parseCreateDeploymentParams: vi.fn((input) => input),
7272
parseDeleteChangeSetParams: vi.fn((input) => input),
7373
parseListStackResourcesParams: vi.fn((input) => input),
74-
parseGetStackOutputsParams: vi.fn((input) => input),
74+
parseDescribeStackParams: vi.fn((input) => input),
7575
parseDescribeChangeSetParams: vi.fn((input) => input),
7676
}));
7777

@@ -713,56 +713,55 @@ describe('StackActionHandler', () => {
713713
});
714714
});
715715

716-
describe('getStackOutputsHandler', () => {
717-
it('returns outputs for a stack', async () => {
716+
describe('describeStackHandler', () => {
717+
it('returns stack info', async () => {
718718
const params = { stackName: 'MyStack' };
719719
const mockOutputs = [
720720
{ OutputKey: 'BucketName', OutputValue: 'my-bucket', Description: 'S3 Bucket' },
721721
{ OutputKey: 'FunctionArn', OutputValue: 'arn:aws:lambda:...', ExportName: 'MyFunction' },
722722
];
723+
const mockParams = [
724+
{ ParameterKey: 'RoleName', ParameterValue: 'MyRole' },
725+
{ ParameterKey: 'LambdaName', ParameterValue: 'MyLambda' },
726+
];
727+
const mockTags = [
728+
{ Key: 'Org', Value: 'Aws' },
729+
{ Key: 'CostCenter', Value: '123' },
730+
];
723731

724732
mockComponents.cfnService.describeStacks.resolves({
725-
Stacks: [{ StackName: 'MyStack', Outputs: mockOutputs }],
726-
} as any);
727-
728-
const handler = getStackOutputsHandler(mockComponents);
729-
const result = (await handler(params, {} as any)) as GetStackOutputsResult;
730-
731-
expect(result.outputs).toHaveLength(2);
732-
expect(result.outputs[0].OutputKey).toBe('BucketName');
733-
expect(result.outputs[1].ExportName).toBe('MyFunction');
734-
});
735-
736-
it('returns empty array when stack has no outputs', async () => {
737-
const params = { stackName: 'MyStack' };
738-
739-
mockComponents.cfnService.describeStacks.resolves({
740-
Stacks: [{ StackName: 'MyStack', Outputs: undefined }],
733+
Stacks: [{ StackName: 'MyStack', Outputs: mockOutputs, Parameters: mockParams, Tags: mockTags }],
741734
} as any);
742735

743-
const handler = getStackOutputsHandler(mockComponents);
744-
const result = (await handler(params, {} as any)) as GetStackOutputsResult;
736+
const handler = describeStackHandler(mockComponents);
737+
const result = (await handler(params, {} as any)) as DescribeStackResult;
745738

746-
expect(result.outputs).toEqual([]);
739+
expect(result.stack?.Outputs).toHaveLength(2);
740+
expect(result.stack?.Outputs?.[0].OutputKey).toBe('BucketName');
741+
expect(result.stack?.Outputs?.[1].ExportName).toBe('MyFunction');
742+
expect(result.stack?.Parameters?.[0].ParameterKey).toBe('RoleName');
743+
expect(result.stack?.Parameters?.[1].ParameterValue).toBe('MyLambda');
744+
expect(result.stack?.Tags?.[0].Key).toBe('Org');
745+
expect(result.stack?.Tags?.[1].Value).toBe('123');
747746
});
748747

749-
it('returns empty array when Stacks array is empty', async () => {
748+
it('returns undefined when Stacks array is empty', async () => {
750749
const params = { stackName: 'MyStack' };
751750

752751
mockComponents.cfnService.describeStacks.resolves({
753752
Stacks: [],
754753
} as any);
755754

756-
const handler = getStackOutputsHandler(mockComponents);
757-
const result = (await handler(params, {} as any)) as GetStackOutputsResult;
755+
const handler = describeStackHandler(mockComponents);
756+
const result = (await handler(params, {} as any)) as DescribeStackResult;
758757

759-
expect(result.outputs).toEqual([]);
758+
expect(result.stack).toBeUndefined();
760759
});
761760

762761
it('throws ResponseError for invalid stack name', async () => {
763762
const params = { stackName: '' };
764763

765-
const handler = getStackOutputsHandler(mockComponents);
764+
const handler = describeStackHandler(mockComponents);
766765

767766
await expect(handler(params, {} as any)).rejects.toThrow(ResponseError);
768767
});
@@ -772,7 +771,7 @@ describe('StackActionHandler', () => {
772771

773772
mockComponents.cfnService.describeStacks.rejects(new Error('Stack not found'));
774773

775-
const handler = getStackOutputsHandler(mockComponents);
774+
const handler = describeStackHandler(mockComponents);
776775

777776
await expect(handler(params, {} as any)).rejects.toThrow(ResponseError);
778777
});

0 commit comments

Comments
 (0)