Skip to content

Commit 64a5aea

Browse files
committed
add support for changeset pagination
1 parent 43f8ba2 commit 64a5aea

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

src/handlers/StackHandler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,14 +266,15 @@ export function listChangeSetsHandler(
266266
): RequestHandler<ListChangeSetParams, ListChangeSetResult, void> {
267267
return async (params: ListChangeSetParams): Promise<ListChangeSetResult> => {
268268
try {
269-
const changeSets = await components.cfnService.listChangeSets(params.stackName);
269+
const result = await components.cfnService.listChangeSets(params.stackName, params.nextToken);
270270
return {
271-
changeSets: changeSets.map((cs) => ({
271+
changeSets: result.changeSets.map((cs) => ({
272272
changeSetName: cs.ChangeSetName ?? '',
273273
status: cs.Status ?? '',
274274
creationTime: cs.CreationTime?.toISOString(),
275275
description: cs.Description,
276276
})),
277+
nextToken: result.nextToken,
277278
};
278279
} catch {
279280
return { changeSets: [] };

src/services/CfnService.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,25 @@ export class CfnService {
334334
return await this.withClient((client) => client.send(new ValidateTemplateCommand(params)));
335335
}
336336

337-
public async listChangeSets(stackName: string): Promise<ChangeSetSummary[]> {
337+
public async listChangeSets(
338+
stackName: string,
339+
nextToken?: string,
340+
): Promise<{ changeSets: ChangeSetSummary[]; nextToken?: string }> {
338341
try {
339342
return await this.withClient(async (client) => {
340-
const response = await client.send(new ListChangeSetsCommand({ StackName: stackName }));
341-
return response.Summaries ?? [];
343+
const response = await client.send(
344+
new ListChangeSetsCommand({
345+
StackName: stackName,
346+
NextToken: nextToken,
347+
}),
348+
);
349+
return {
350+
changeSets: response.Summaries ?? [],
351+
nextToken: response.NextToken,
352+
};
342353
});
343354
} catch {
344-
return [];
355+
return { changeSets: [] };
345356
}
346357
}
347358
}

src/stacks/StackRequestType.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const GetStackTemplateRequest = new RequestType<GetStackTemplateParams, G
3030

3131
export type ListChangeSetParams = {
3232
stackName: string;
33+
nextToken?: string;
3334
};
3435

3536
export type ListChangeSetResult = {
@@ -39,6 +40,7 @@ export type ListChangeSetResult = {
3940
creationTime?: string;
4041
description?: string;
4142
}>;
43+
nextToken?: string;
4244
};
4345

4446
export const ListChangeSetRequest = new RequestType<ListChangeSetParams, ListChangeSetResult, void>(

tst/unit/handlers/ListChangeSetsHandler.test.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,31 @@ describe('listChangeSetsHandler', () => {
2121
expect(result).toEqual({ changeSets: [] });
2222
});
2323

24-
it('should transform change sets correctly', async () => {
25-
const mockChangeSets = [
26-
{
27-
ChangeSetName: 'changeset-1',
28-
Status: 'CREATE_COMPLETE',
29-
CreationTime: new Date('2023-01-01T00:00:00Z'),
30-
Description: 'Test changeset',
31-
},
32-
];
24+
it('should transform change sets correctly with pagination', async () => {
25+
const mockResult = {
26+
changeSets: [
27+
{
28+
ChangeSetName: 'changeset-1',
29+
Status: 'CREATE_COMPLETE',
30+
CreationTime: new Date('2023-01-01T00:00:00Z'),
31+
Description: 'Test changeset',
32+
},
33+
],
34+
nextToken: 'next-page-token',
35+
};
3336

3437
const mockCfnService = {
35-
listChangeSets: vi.fn().mockResolvedValue(mockChangeSets),
38+
listChangeSets: vi.fn().mockResolvedValue(mockResult),
3639
};
3740

3841
const mockComponents = {
3942
cfnService: mockCfnService,
4043
} as unknown as ServerComponents;
4144

4245
const handler = listChangeSetsHandler(mockComponents);
43-
const result = await handler({ stackName: 'test-stack' }, mockToken);
46+
const result = await handler({ stackName: 'test-stack', nextToken: 'some-token' }, mockToken);
4447

48+
expect(mockCfnService.listChangeSets).toHaveBeenCalledWith('test-stack', 'some-token');
4549
expect(result).toEqual({
4650
changeSets: [
4751
{
@@ -51,6 +55,7 @@ describe('listChangeSetsHandler', () => {
5155
description: 'Test changeset',
5256
},
5357
],
58+
nextToken: 'next-page-token',
5459
});
5560
});
5661
});

0 commit comments

Comments
 (0)