Skip to content

Commit d71a676

Browse files
committed
fix: remove some unnecessary calls to the API
1 parent 56fd5f2 commit d71a676

3 files changed

Lines changed: 20 additions & 9 deletions

File tree

.changeset/tricky-ways-retire.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smartthings/cli": patch
3+
---
4+
5+
remove some unnecessary calls to the API

src/__tests__/lib/command/util/util-util.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ describe('createChooseFn', () => {
166166
it('uses listItems from createChooseFn by default', async () => {
167167
expect(await chooseSimpleType(command)).toBe('selected-simple-type-id')
168168

169-
expect(itemListMock).toHaveBeenCalledExactlyOnceWith(command)
169+
// The list function should not be called until it's actually used.
170+
expect(itemListMock).toHaveBeenCalledTimes(0)
170171

171172
const listItems = selectFromListMock.mock.calls[0][2].listItems
172173

@@ -183,7 +184,7 @@ describe('createChooseFn', () => {
183184
expect(await chooseSimpleType(command, undefined, { listItems: overridingListItemsMock }))
184185
.toBe('selected-simple-type-id')
185186

186-
expect(overridingListItemsMock).toHaveBeenCalledExactlyOnceWith(command)
187+
expect(overridingListItemsMock).toHaveBeenCalledTimes(0)
187188
expect(itemListMock).not.toHaveBeenCalled()
188189

189190
const listItems = selectFromListMock.mock.calls[0][2].listItems

src/lib/command/util/util-util.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export type CreateChooseFunctionOptions<T extends object> = {
4545

4646
export type ChooseFunction<T extends object> = (
4747
command: APICommand<SelectFromListFlags>,
48-
itemIdOrNameFromArg?: string,
48+
itemIdOrIndexFromArg?: string,
4949
options?: Partial<ChooseOptions<T>>) => Promise<string>
5050

5151
export const createChooseFn = <T extends object>(
@@ -55,20 +55,25 @@ export const createChooseFn = <T extends object>(
5555
): ChooseFunction<T> =>
5656
async (
5757
command: APICommand<SelectFromListFlags>,
58-
itemIdOrNameFromArg?: string,
58+
itemIdOrIndexFromArg?: string,
5959
options?: Partial<ChooseOptions<T>>,
6060
): Promise<string> => {
6161
const opts = chooseOptionsWithDefaults(options)
6262

6363
// Listing items usually makes an API call which we only want to happen once so we do it
6464
// now and just use stub functions that return these items later as needed.
65-
const items = await (opts.listItems ?? listItems)(command)
66-
const filteredItems = opts.listFilter ? items.filter(opts.listFilter) : items
67-
const listItemsWrapper = async (): Promise<T[]> => filteredItems
65+
let items: T[] | undefined = undefined
66+
const listItemsWrapper = async (): Promise<T[]> => {
67+
if (!items) {
68+
items = await (opts.listItems ?? listItems)(command)
69+
}
70+
const filteredItems = opts.listFilter ? items.filter(opts.listFilter) : items
71+
return filteredItems
72+
}
6873

6974
const preselectedId = opts.allowIndex
70-
? await stringTranslateToId(config, itemIdOrNameFromArg, listItemsWrapper)
71-
: itemIdOrNameFromArg
75+
? await stringTranslateToId(config, itemIdOrIndexFromArg, listItemsWrapper)
76+
: itemIdOrIndexFromArg
7277

7378
const selectOptions: SelectOptions<T> = {
7479
preselectedId,

0 commit comments

Comments
 (0)