Skip to content

Commit 128f408

Browse files
committed
update task rendering
1 parent 3fbe8e9 commit 128f408

2 files changed

Lines changed: 33 additions & 17 deletions

File tree

packages/cli-kit/src/public/node/ui.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -485,18 +485,17 @@ describe('renderSingleTask', async () => {
485485
await expect(renderSingleTask({title, task})).rejects.toThrow('Delayed failure')
486486
})
487487

488-
test('handles concurrent single tasks', async () => {
488+
test('handles sequential single tasks', async () => {
489489
// Given
490490
const task1 = () => new Promise((resolve) => setTimeout(() => resolve('result1'), 50))
491491
const task2 = () => new Promise((resolve) => setTimeout(() => resolve('result2'), 100))
492492
const task3 = () => new Promise((resolve) => setTimeout(() => resolve('result3'), 25))
493493

494-
// When
495-
const [result1, result2, result3] = await Promise.all([
496-
renderSingleTask({title: new TokenizedString('Task 1'), task: task1}),
497-
renderSingleTask({title: new TokenizedString('Task 2'), task: task2}),
498-
renderSingleTask({title: new TokenizedString('Task 3'), task: task3}),
499-
])
494+
// When — ink only supports one render instance per stdout at a time,
495+
// so sequential execution is the correct pattern
496+
const result1 = await renderSingleTask({title: new TokenizedString('Task 1'), task: task1})
497+
const result2 = await renderSingleTask({title: new TokenizedString('Task 2'), task: task2})
498+
const result3 = await renderSingleTask({title: new TokenizedString('Task 3'), task: task3})
500499

501500
// Then
502501
expect(result1).toBe('result1')

packages/cli-kit/src/public/node/ui.tsx

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -487,14 +487,21 @@ export async function renderTasks<TContext>(
487487
tasks: Task<TContext>[],
488488
{renderOptions, noProgressBar}: RenderTasksOptions = {},
489489
) {
490-
return new Promise<TContext>((resolve, reject) => {
491-
render(<Tasks tasks={tasks} onComplete={resolve} noProgressBar={noProgressBar} />, {
490+
let taskResult: TContext
491+
await render(
492+
<Tasks
493+
tasks={tasks}
494+
onComplete={(ctx) => {
495+
taskResult = ctx
496+
}}
497+
noProgressBar={noProgressBar}
498+
/>,
499+
{
492500
...renderOptions,
493501
exitOnCtrlC: false,
494-
})
495-
.then(() => {})
496-
.catch(reject)
497-
})
502+
},
503+
)
504+
return taskResult!
498505
}
499506

500507
export interface RenderSingleTaskOptions<T> {
@@ -521,12 +528,22 @@ export async function renderSingleTask<T>({
521528
onAbort,
522529
renderOptions,
523530
}: RenderSingleTaskOptions<T>): Promise<T> {
524-
return new Promise<T>((resolve, reject) => {
525-
render(<SingleTask title={title} task={task} onComplete={resolve} onAbort={onAbort} />, {
531+
let taskResult: T
532+
await render(
533+
<SingleTask
534+
title={title}
535+
task={task}
536+
onComplete={(result) => {
537+
taskResult = result
538+
}}
539+
onAbort={onAbort}
540+
/>,
541+
{
526542
...renderOptions,
527543
exitOnCtrlC: false,
528-
}).catch(reject)
529-
})
544+
},
545+
)
546+
return taskResult!
530547
}
531548

532549
export interface RenderTextPromptOptions extends Omit<TextPromptProps, 'onSubmit'> {

0 commit comments

Comments
 (0)