diff --git a/packages/devkit/src/utils/async-iterable/create-async-iterable.spec.ts b/packages/devkit/src/utils/async-iterable/create-async-iterable.spec.ts index faedf38e62..5b1f16862d 100644 --- a/packages/devkit/src/utils/async-iterable/create-async-iterable.spec.ts +++ b/packages/devkit/src/utils/async-iterable/create-async-iterable.spec.ts @@ -1,4 +1,5 @@ import { createAsyncIterable } from './create-async-iterable'; +import { getLastValueFromAsyncIterableIterator } from 'nx/src/utils/async-iterator'; describe(createAsyncIterable.name, () => { test('simple callback', async () => { @@ -55,4 +56,15 @@ describe(createAsyncIterable.name, () => { expect(results).toEqual(['first', 'second', 'third', 'fourth']); }); + + test('works with getLastValueFromAsyncIterableIterator', async () => { + const it = createAsyncIterable(({ next, done }) => { + setTimeout(() => { + next('foo'); + done(); + }); + }); + const result = await getLastValueFromAsyncIterableIterator(it); + expect(result).toEqual('foo'); + }); }); diff --git a/packages/nx/src/utils/async-iterator.ts b/packages/nx/src/utils/async-iterator.ts index af0f668dd7..dd7030c1e0 100644 --- a/packages/nx/src/utils/async-iterator.ts +++ b/packages/nx/src/utils/async-iterator.ts @@ -3,13 +3,17 @@ export function isAsyncIterator(v: any): v is AsyncIterableIterator { } export async function getLastValueFromAsyncIterableIterator( - i: AsyncIterableIterator + i: AsyncIterable | AsyncIterableIterator ): Promise { let prev: IteratorResult; let current: IteratorResult; + + const generator = i[Symbol.asyncIterator] || i[Symbol.iterator]; + const iterator = generator.call(i); + do { prev = current; - current = await i.next(); + current = await iterator.next(); } while (!current.done); return current.value !== undefined || !prev ? current.value : prev.value;