From 658f8cf73a6239f47080952c55c4384d6cf268f8 Mon Sep 17 00:00:00 2001 From: Ross Stenersen Date: Mon, 23 Feb 2026 13:51:22 -0600 Subject: [PATCH] fix: remove some unnecessary calls to the API --- .changeset/tricky-ways-retire.md | 5 +++++ .../lib/command/util/util-util.test.ts | 5 +++-- src/lib/command/util/util-util.ts | 19 ++++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 .changeset/tricky-ways-retire.md 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,