diff --git a/packages/cli-kit/src/private/node/ui/components/Tasks.test.tsx b/packages/cli-kit/src/private/node/ui/components/Tasks.test.tsx
index 39a9e6a955f..ab192ca1a45 100644
--- a/packages/cli-kit/src/private/node/ui/components/Tasks.test.tsx
+++ b/packages/cli-kit/src/private/node/ui/components/Tasks.test.tsx
@@ -1,6 +1,6 @@
import {Task, Tasks} from './Tasks.js'
import {getLastFrameAfterUnmount, render} from '../../testing/ui.js'
-import {unstyled} from '../../../../public/node/output.js'
+import {unstyled, TokenizedString} from '../../../../public/node/output.js'
import {AbortController} from '../../../../public/node/abort.js'
import {Stdout} from '../../ui.js'
import React from 'react'
@@ -392,6 +392,31 @@ describe('Tasks', () => {
expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toEqual('')
await expect(promise).resolves.toEqual(undefined)
})
+
+ test('supports TokenizedString as title', async () => {
+ // Given
+ const firstTaskFunction = vi.fn(async () => {})
+ const secondTaskFunction = vi.fn(async () => {})
+
+ const firstTask: Task = {
+ title: new TokenizedString('tokenized task 1'),
+ task: firstTaskFunction,
+ }
+
+ const secondTask: Task = {
+ title: 'string task 2',
+ task: secondTaskFunction,
+ }
+
+ // When
+ const renderInstance = render()
+ await renderInstance.waitUntilExit()
+
+ // Then
+ expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot('""')
+ expect(firstTaskFunction).toHaveBeenCalled()
+ expect(secondTaskFunction).toHaveBeenCalled()
+ })
})
async function taskHasRendered() {
diff --git a/packages/cli-kit/src/private/node/ui/components/Tasks.tsx b/packages/cli-kit/src/private/node/ui/components/Tasks.tsx
index 05ea0c57a90..cb5153d1793 100644
--- a/packages/cli-kit/src/private/node/ui/components/Tasks.tsx
+++ b/packages/cli-kit/src/private/node/ui/components/Tasks.tsx
@@ -4,10 +4,11 @@ import {isUnitTest} from '../../../../public/node/context/local.js'
import {AbortSignal} from '../../../../public/node/abort.js'
import useAbortSignal from '../hooks/use-abort-signal.js'
import {useExitOnCtrlC} from '../hooks/use-exit-on-ctrl-c.js'
+import {TokenizedString} from '../../../../public/node/output.js'
import React, {useRef, useState} from 'react'
export interface Task {
- title: string
+ title: string | TokenizedString
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
task: (ctx: TContext, task: Task) => Promise[]>
retry?: number
@@ -107,8 +108,10 @@ function Tasks({
return null
}
+ const title = typeof currentTask.title === 'string' ? currentTask.title : currentTask.title.value
+
return state === TasksState.Loading && !isAborted ? (
-
+
) : null
}