UNPKG

@shopify/cli-kit

Version:

A set of utilities, interfaces, and models that are common across all the platform features

77 lines 3.02 kB
import { LoadingBar } from './LoadingBar.js'; import useAsyncAndUnmount from '../hooks/use-async-and-unmount.js'; import { isUnitTest } from '../../../../public/node/context/local.js'; import useAbortSignal from '../hooks/use-abort-signal.js'; import { useExitOnCtrlC } from '../hooks/use-exit-on-ctrl-c.js'; import React, { useRef, useState } from 'react'; var TasksState; (function (TasksState) { TasksState["Loading"] = "loading"; TasksState["Success"] = "success"; TasksState["Failure"] = "failure"; })(TasksState || (TasksState = {})); async function runTask(task, ctx) { task.retryCount = 0; task.errors = []; const retry = task.retry && task.retry > 0 ? task.retry + 1 : 1; for (let retries = 1; retries <= retry; retries++) { try { if (task.skip?.(ctx)) { return; } // eslint-disable-next-line no-await-in-loop return await task.task(ctx, task); // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error) { if (retries === retry) { throw error; } else { task.errors.push(error); task.retryCount = retries; } } } } const noop = () => { }; // eslint-disable-next-line react/function-component-definition function Tasks({ tasks, silent = isUnitTest(), onComplete = noop, abortSignal, noColor, noProgressBar = false, }) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const [currentTask, setCurrentTask] = useState(tasks[0]); const [state, setState] = useState(TasksState.Loading); const ctx = useRef({}); const runTasks = async () => { for (const task of tasks) { setCurrentTask(task); // eslint-disable-next-line no-await-in-loop const subTasks = await runTask(task, ctx.current); // subtasks if (Array.isArray(subTasks) && subTasks.length > 0 && subTasks.every((task) => 'task' in task)) { for (const subTask of subTasks) { setCurrentTask(subTask); // eslint-disable-next-line no-await-in-loop await runTask(subTask, ctx.current); } } } }; useAsyncAndUnmount(runTasks, { onFulfilled: () => { setState(TasksState.Success); onComplete(ctx.current); }, onRejected: () => { setState(TasksState.Failure); }, }); useExitOnCtrlC(); const { isAborted } = useAbortSignal(abortSignal); if (silent) { return null; } const title = typeof currentTask.title === 'string' ? currentTask.title : currentTask.title.value; return state === TasksState.Loading && !isAborted ? (React.createElement(LoadingBar, { title: title, noColor: noColor, noProgressBar: noProgressBar })) : null; } export { Tasks }; //# sourceMappingURL=Tasks.js.map