diff --git a/.changeset/tricky-ways-retire.md b/.changeset/tricky-ways-retire.md new file mode 100644 index 00000000..fdd4c7eb --- /dev/null +++ b/.changeset/tricky-ways-retire.md @@ -0,0 +1,5 @@ +--- +"@smartthings/cli": patch +--- + +remove some unnecessary calls to the API diff --git a/src/__tests__/lib/command/util/util-util.test.ts b/src/__tests__/lib/command/util/util-util.test.ts index f06dcbec..8200edd1 100644 --- a/src/__tests__/lib/command/util/util-util.test.ts +++ b/src/__tests__/lib/command/util/util-util.test.ts @@ -166,7 +166,8 @@ describe('createChooseFn', () => { it('uses listItems from createChooseFn by default', async () => { expect(await chooseSimpleType(command)).toBe('selected-simple-type-id') - expect(itemListMock).toHaveBeenCalledExactlyOnceWith(command) + // The list function should not be called until it's actually used. + expect(itemListMock).toHaveBeenCalledTimes(0) const listItems = selectFromListMock.mock.calls[0][2].listItems @@ -183,7 +184,7 @@ describe('createChooseFn', () => { expect(await chooseSimpleType(command, undefined, { listItems: overridingListItemsMock })) .toBe('selected-simple-type-id') - expect(overridingListItemsMock).toHaveBeenCalledExactlyOnceWith(command) + expect(overridingListItemsMock).toHaveBeenCalledTimes(0) expect(itemListMock).not.toHaveBeenCalled() const listItems = selectFromListMock.mock.calls[0][2].listItems diff --git a/src/lib/command/util/util-util.ts b/src/lib/command/util/util-util.ts index f5b7ec4e..7e8c5821 100644 --- a/src/lib/command/util/util-util.ts +++ b/src/lib/command/util/util-util.ts @@ -45,7 +45,7 @@ export type CreateChooseFunctionOptions = { export type ChooseFunction = ( command: APICommand, - itemIdOrNameFromArg?: string, + itemIdOrIndexFromArg?: string, options?: Partial>) => Promise export const createChooseFn = ( @@ -55,20 +55,25 @@ export const createChooseFn = ( ): ChooseFunction => async ( command: APICommand, - itemIdOrNameFromArg?: string, + itemIdOrIndexFromArg?: string, options?: Partial>, ): Promise => { const opts = chooseOptionsWithDefaults(options) // Listing items usually makes an API call which we only want to happen once so we do it // now and just use stub functions that return these items later as needed. - const items = await (opts.listItems ?? listItems)(command) - const filteredItems = opts.listFilter ? items.filter(opts.listFilter) : items - const listItemsWrapper = async (): Promise => filteredItems + let items: T[] | undefined = undefined + const listItemsWrapper = async (): Promise => { + if (!items) { + items = await (opts.listItems ?? listItems)(command) + } + const filteredItems = opts.listFilter ? items.filter(opts.listFilter) : items + return filteredItems + } const preselectedId = opts.allowIndex - ? await stringTranslateToId(config, itemIdOrNameFromArg, listItemsWrapper) - : itemIdOrNameFromArg + ? await stringTranslateToId(config, itemIdOrIndexFromArg, listItemsWrapper) + : itemIdOrIndexFromArg const selectOptions: SelectOptions = { preselectedId,