diff --git a/packages/nx/src/native/index.d.ts b/packages/nx/src/native/index.d.ts index 18710c0796..20f24b6f40 100644 --- a/packages/nx/src/native/index.d.ts +++ b/packages/nx/src/native/index.d.ts @@ -254,6 +254,8 @@ export interface NxWorkspaceFilesExternals { allWorkspaceFiles: ExternalObject> } +export declare export declare function parseTaskStatus(stringStatus: string): TaskStatus + export interface Project { root: string namedInputs?: Record> diff --git a/packages/nx/src/native/native-bindings.js b/packages/nx/src/native/native-bindings.js index 0d9e7abbb5..b179e3834b 100644 --- a/packages/nx/src/native/native-bindings.js +++ b/packages/nx/src/native/native-bindings.js @@ -388,6 +388,7 @@ module.exports.getTransformableOutputs = nativeBinding.getTransformableOutputs module.exports.hashArray = nativeBinding.hashArray module.exports.hashFile = nativeBinding.hashFile module.exports.IS_WASM = nativeBinding.IS_WASM +module.exports.parseTaskStatus = nativeBinding.parseTaskStatus module.exports.remove = nativeBinding.remove module.exports.restoreTerminal = nativeBinding.restoreTerminal module.exports.TaskStatus = nativeBinding.TaskStatus diff --git a/packages/nx/src/native/tui/app.rs b/packages/nx/src/native/tui/app.rs index 82f8a44aae..ae756d078b 100644 --- a/packages/nx/src/native/tui/app.rs +++ b/packages/nx/src/native/tui/app.rs @@ -182,7 +182,6 @@ impl App { &mut self, task_id: String, parser_and_writer: External<(ParserArc, WriterArc)>, - task_status: TaskStatus, ) { if let Some(tasks_list) = self .components @@ -190,7 +189,7 @@ impl App { .find_map(|c| c.as_any_mut().downcast_mut::()) { tasks_list.create_and_register_pty_instance(&task_id, parser_and_writer); - tasks_list.update_task_status(task_id.clone(), task_status); + tasks_list.set_task_status(task_id.clone(), TaskStatus::InProgress); } } @@ -203,7 +202,7 @@ impl App { let (_, parser_and_writer) = TasksList::create_empty_parser_and_noop_writer(); tasks_list.create_and_register_pty_instance(&task_id, parser_and_writer); - tasks_list.update_task_status(task_id.clone(), TaskStatus::InProgress); + tasks_list.set_task_status(task_id.clone(), TaskStatus::InProgress); let _ = tasks_list.handle_resize(None); } } diff --git a/packages/nx/src/native/tui/components/tasks_list.rs b/packages/nx/src/native/tui/components/tasks_list.rs index 59fa2d4fad..c8774a907c 100644 --- a/packages/nx/src/native/tui/components/tasks_list.rs +++ b/packages/nx/src/native/tui/components/tasks_list.rs @@ -152,6 +152,11 @@ impl std::str::FromStr for TaskStatus { } } +#[napi] +pub fn parse_task_status(string_status: String) -> napi::Result { + string_status.as_str().parse().map_err(napi::Error::from_reason) +} + /// A list component that displays and manages tasks in a terminal UI. /// Provides filtering, sorting, and output display capabilities. pub struct TasksList { @@ -927,12 +932,12 @@ impl TasksList { self.sort_tasks(); } - /// Updates their status to InProgress and triggers a sort. + /// Updates a task's status and triggers a sort of the list. pub fn set_task_status(&mut self, task_id: String, status: TaskStatus) { if let Some(task_item) = self.tasks.iter_mut().find(|t| t.name == task_id) { task_item.update_status(status); + self.sort_tasks(); } - self.sort_tasks(); } pub fn end_tasks(&mut self, task_results: Vec) { @@ -942,9 +947,6 @@ impl TasksList { .iter_mut() .find(|t| t.name == task_result.task.id) { - let parsed_status = task_result.status.parse().unwrap(); - task.update_status(parsed_status); - if task_result.task.start_time.is_some() && task_result.task.end_time.is_some() { task.start_time = Some(task_result.task.start_time.unwrap() as u128); task.end_time = Some(task_result.task.end_time.unwrap() as u128); @@ -960,13 +962,6 @@ impl TasksList { let _ = self.handle_resize(None); } - pub fn update_task_status(&mut self, task_id: String, status: TaskStatus) { - if let Some(task) = self.tasks.iter_mut().find(|t| t.name == task_id) { - task.update_status(status); - self.sort_tasks(); - } - } - /// Toggles the visibility of the task list panel pub fn toggle_task_list(&mut self) { // Only allow hiding if at least one pane is visible, otherwise the screen will be blank @@ -1108,6 +1103,7 @@ impl Component for TasksList { TaskStatus::Success | TaskStatus::Failure | TaskStatus::Skipped + | TaskStatus::Stopped | TaskStatus::LocalCache | TaskStatus::LocalCacheKeptExisting | TaskStatus::RemoteCache diff --git a/packages/nx/src/native/tui/lifecycle.rs b/packages/nx/src/native/tui/lifecycle.rs index eff31c3689..87bf6a7741 100644 --- a/packages/nx/src/native/tui/lifecycle.rs +++ b/packages/nx/src/native/tui/lifecycle.rs @@ -238,7 +238,7 @@ impl AppLifeCycle { parser_and_writer: External<(ParserArc, WriterArc)>, ) { let mut app = self.app.lock().unwrap(); - app.register_running_task(task_id, parser_and_writer, TaskStatus::InProgress) + app.register_running_task(task_id, parser_and_writer) } #[napi] diff --git a/packages/nx/src/tasks-runner/task-orchestrator.ts b/packages/nx/src/tasks-runner/task-orchestrator.ts index 387ae8e9d0..7cbb10bd88 100644 --- a/packages/nx/src/tasks-runner/task-orchestrator.ts +++ b/packages/nx/src/tasks-runner/task-orchestrator.ts @@ -10,6 +10,7 @@ import { runCommands } from '../executors/run-commands/run-commands.impl'; import { getTaskDetails, hashTask } from '../hasher/hash-task'; import { TaskHasher } from '../hasher/task-hasher'; import { + parseTaskStatus, RunningTasksService, TaskDetails, TaskStatus as NativeTaskStatus, @@ -879,6 +880,10 @@ export class TaskOrchestrator { if (this.completedTasks[taskId] === undefined) { this.completedTasks[taskId] = status; + if (this.tuiEnabled) { + this.options.lifeCycle.setTaskStatus(taskId, parseTaskStatus(status)); + } + if (status === 'failure' || status === 'skipped') { if (this.bail) { // mark the execution as bailed which will stop all further execution