index.cjs 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329
  1. "use strict";
  2. var __create = Object.create;
  3. var __defProp = Object.defineProperty;
  4. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  5. var __getOwnPropNames = Object.getOwnPropertyNames;
  6. var __getProtoOf = Object.getPrototypeOf;
  7. var __hasOwnProp = Object.prototype.hasOwnProperty;
  8. var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
  9. var __export = (target, all) => {
  10. for (var name in all)
  11. __defProp(target, name, { get: all[name], enumerable: true });
  12. };
  13. var __copyProps = (to, from, except, desc) => {
  14. if (from && typeof from === "object" || typeof from === "function") {
  15. for (let key of __getOwnPropNames(from))
  16. if (!__hasOwnProp.call(to, key) && key !== except)
  17. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  18. }
  19. return to;
  20. };
  21. var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  22. // If the importer is in node compatibility mode or this is not an ESM
  23. // file that has been converted to a CommonJS file using a Babel-
  24. // compatible transform (i.e. "__esModule" has not been set), then set
  25. // "default" to the CommonJS "module.exports" for node compatibility.
  26. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  27. mod
  28. ));
  29. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  30. // src/index.ts
  31. var src_exports = {};
  32. __export(src_exports, {
  33. ANSI_ESCAPE: () => ANSI_ESCAPE,
  34. ANSI_ESCAPE_CODES: () => ANSI_ESCAPE_CODES,
  35. BaseEventMap: () => BaseEventMap,
  36. Concurrency: () => Concurrency,
  37. DefaultRenderer: () => DefaultRenderer,
  38. EventManager: () => EventManager,
  39. LISTR_DEFAULT_RENDERER_STYLE: () => LISTR_DEFAULT_RENDERER_STYLE,
  40. LISTR_LOGGER_STDERR_LEVELS: () => LISTR_LOGGER_STDERR_LEVELS,
  41. LISTR_LOGGER_STYLE: () => LISTR_LOGGER_STYLE,
  42. Listr: () => Listr,
  43. ListrDefaultRendererLogLevels: () => ListrDefaultRendererLogLevels,
  44. ListrEnvironmentVariables: () => ListrEnvironmentVariables,
  45. ListrError: () => ListrError,
  46. ListrErrorTypes: () => ListrErrorTypes,
  47. ListrEventManager: () => ListrEventManager,
  48. ListrEventType: () => ListrEventType,
  49. ListrLogLevels: () => ListrLogLevels,
  50. ListrLogger: () => ListrLogger,
  51. ListrRendererError: () => ListrRendererError,
  52. ListrTaskEventManager: () => ListrTaskEventManager,
  53. ListrTaskEventType: () => ListrTaskEventType,
  54. ListrTaskState: () => ListrTaskState,
  55. Manager: () => Manager,
  56. PRESET_TIMER: () => PRESET_TIMER,
  57. PRESET_TIMESTAMP: () => PRESET_TIMESTAMP,
  58. ProcessOutput: () => ProcessOutput,
  59. ProcessOutputBuffer: () => ProcessOutputBuffer,
  60. ProcessOutputStream: () => ProcessOutputStream,
  61. PromptError: () => PromptError,
  62. SilentRenderer: () => SilentRenderer,
  63. SimpleRenderer: () => SimpleRenderer,
  64. Spinner: () => Spinner,
  65. TestRenderer: () => TestRenderer,
  66. TestRendererSerializer: () => TestRendererSerializer,
  67. VerboseRenderer: () => VerboseRenderer,
  68. assertFunctionOrSelf: () => assertFunctionOrSelf,
  69. cleanseAnsi: () => cleanseAnsi,
  70. cloneObject: () => cloneObject,
  71. color: () => color,
  72. createPrompt: () => createPrompt,
  73. createWritable: () => createWritable,
  74. delay: () => delay,
  75. figures: () => figures,
  76. getRenderer: () => getRenderer,
  77. getRendererClass: () => getRendererClass,
  78. indent: () => indent,
  79. isObservable: () => isObservable,
  80. isUnicodeSupported: () => isUnicodeSupported,
  81. parseTimer: () => parseTimer,
  82. parseTimestamp: () => parseTimestamp,
  83. splat: () => splat
  84. });
  85. module.exports = __toCommonJS(src_exports);
  86. // src/constants/ansi-escape-codes.constants.ts
  87. var ANSI_ESCAPE = "\x1B[";
  88. var ANSI_ESCAPE_CODES = {
  89. CURSOR_HIDE: ANSI_ESCAPE + "?25l",
  90. CURSOR_SHOW: ANSI_ESCAPE + "?25h"
  91. };
  92. // src/constants/environment-variables.constants.ts
  93. var ListrEnvironmentVariables = /* @__PURE__ */ ((ListrEnvironmentVariables2) => {
  94. ListrEnvironmentVariables2["DISABLE_COLOR"] = "LISTR_DISABLE_COLOR";
  95. ListrEnvironmentVariables2["FORCE_UNICODE"] = "LISTR_FORCE_UNICODE";
  96. ListrEnvironmentVariables2["FORCE_COLOR"] = "FORCE_COLOR";
  97. return ListrEnvironmentVariables2;
  98. })(ListrEnvironmentVariables || {});
  99. // src/constants/listr-error.constants.ts
  100. var ListrErrorTypes = /* @__PURE__ */ ((ListrErrorTypes2) => {
  101. ListrErrorTypes2["WILL_RETRY"] = "WILL_RETRY";
  102. ListrErrorTypes2["WILL_ROLLBACK"] = "WILL_ROLLBACK";
  103. ListrErrorTypes2["HAS_FAILED_TO_ROLLBACK"] = "HAS_FAILED_TO_ROLLBACK";
  104. ListrErrorTypes2["HAS_FAILED"] = "HAS_FAILED";
  105. ListrErrorTypes2["HAS_FAILED_WITHOUT_ERROR"] = "HAS_FAILED_WITHOUT_ERROR";
  106. return ListrErrorTypes2;
  107. })(ListrErrorTypes || {});
  108. // src/constants/listr-events.constants.ts
  109. var ListrEventType = /* @__PURE__ */ ((ListrEventType2) => {
  110. ListrEventType2["SHOULD_REFRESH_RENDER"] = "SHOUD_REFRESH_RENDER";
  111. return ListrEventType2;
  112. })(ListrEventType || {});
  113. // src/constants/listr-task-events.constants.ts
  114. var ListrTaskEventType = /* @__PURE__ */ ((ListrTaskEventType2) => {
  115. ListrTaskEventType2["TITLE"] = "TITLE";
  116. ListrTaskEventType2["STATE"] = "STATE";
  117. ListrTaskEventType2["ENABLED"] = "ENABLED";
  118. ListrTaskEventType2["SUBTASK"] = "SUBTASK";
  119. ListrTaskEventType2["PROMPT"] = "PROMPT";
  120. ListrTaskEventType2["OUTPUT"] = "OUTPUT";
  121. ListrTaskEventType2["MESSAGE"] = "MESSAGE";
  122. ListrTaskEventType2["CLOSED"] = "CLOSED";
  123. return ListrTaskEventType2;
  124. })(ListrTaskEventType || {});
  125. // src/constants/listr-task-state.constants.ts
  126. var ListrTaskState = /* @__PURE__ */ ((ListrTaskState2) => {
  127. ListrTaskState2["WAITING"] = "WAITING";
  128. ListrTaskState2["STARTED"] = "STARTED";
  129. ListrTaskState2["COMPLETED"] = "COMPLETED";
  130. ListrTaskState2["FAILED"] = "FAILED";
  131. ListrTaskState2["SKIPPED"] = "SKIPPED";
  132. ListrTaskState2["ROLLING_BACK"] = "ROLLING_BACK";
  133. ListrTaskState2["ROLLED_BACK"] = "ROLLED_BACK";
  134. ListrTaskState2["RETRY"] = "RETRY";
  135. ListrTaskState2["PAUSED"] = "PAUSED";
  136. ListrTaskState2["PROMPT"] = "PROMPT";
  137. ListrTaskState2["PROMPT_COMPLETED"] = "PROMPT_COMPLETED";
  138. return ListrTaskState2;
  139. })(ListrTaskState || {});
  140. // src/lib/event-manager.ts
  141. var import_eventemitter3 = __toESM(require("eventemitter3"), 1);
  142. var _EventManager = class _EventManager {
  143. constructor() {
  144. this.emitter = new import_eventemitter3.default();
  145. }
  146. emit(dispatch, args) {
  147. this.emitter.emit(dispatch, args);
  148. }
  149. on(dispatch, handler) {
  150. this.emitter.addListener(dispatch, handler);
  151. }
  152. once(dispatch, handler) {
  153. this.emitter.once(dispatch, handler);
  154. }
  155. off(dispatch, handler) {
  156. this.emitter.off(dispatch, handler);
  157. }
  158. complete() {
  159. this.emitter.removeAllListeners();
  160. }
  161. };
  162. __name(_EventManager, "EventManager");
  163. var EventManager = _EventManager;
  164. // src/interfaces/event.interface.ts
  165. var _BaseEventMap = class _BaseEventMap {
  166. };
  167. __name(_BaseEventMap, "BaseEventMap");
  168. var BaseEventMap = _BaseEventMap;
  169. // src/utils/environment/is-observable.ts
  170. function isObservable(obj) {
  171. return !!obj && typeof obj.lift === "function" && typeof obj.subscribe === "function";
  172. }
  173. __name(isObservable, "isObservable");
  174. // src/utils/environment/is-unicode-supported.ts
  175. function isUnicodeSupported() {
  176. return !!process.env["LISTR_FORCE_UNICODE" /* FORCE_UNICODE */] || process.platform !== "win32" || !!process.env.CI || !!process.env.WT_SESSION || process.env.TERM_PROGRAM === "vscode" || process.env.TERM === "xterm-256color" || process.env.TERM === "alacritty";
  177. }
  178. __name(isUnicodeSupported, "isUnicodeSupported");
  179. // src/utils/format/cleanse-ansi.constants.ts
  180. var CLEAR_LINE_REGEX = "(?:\\u001b|\\u009b)\\[[\\=><~/#&.:=?%@~_-]*[0-9]*[\\a-ln-tqyz=><~/#&.:=?%@~_-]+";
  181. var BELL_REGEX = /\u0007/;
  182. // src/utils/format/cleanse-ansi.ts
  183. function cleanseAnsi(chunk) {
  184. return String(chunk).replace(new RegExp(CLEAR_LINE_REGEX, "gmi"), "").replace(new RegExp(BELL_REGEX, "gmi"), "").trim();
  185. }
  186. __name(cleanseAnsi, "cleanseAnsi");
  187. // src/utils/format/color.ts
  188. var import_colorette = require("colorette");
  189. var color = (0, import_colorette.createColors)({ useColor: !process.env["LISTR_DISABLE_COLOR" /* DISABLE_COLOR */] });
  190. // src/utils/format/indent.ts
  191. function indent(string, count) {
  192. return string.replace(/^(?!\s*$)/gm, " ".repeat(count));
  193. }
  194. __name(indent, "indent");
  195. // src/utils/format/figures.ts
  196. var FIGURES_MAIN = {
  197. warning: "\u26A0",
  198. cross: "\u2716",
  199. arrowDown: "\u2193",
  200. tick: "\u2714",
  201. arrowRight: "\u2192",
  202. pointer: "\u276F",
  203. checkboxOn: "\u2612",
  204. arrowLeft: "\u2190",
  205. squareSmallFilled: "\u25FC",
  206. pointerSmall: "\u203A"
  207. };
  208. var FIGURES_FALLBACK = {
  209. ...FIGURES_MAIN,
  210. warning: "\u203C",
  211. cross: "\xD7",
  212. tick: "\u221A",
  213. pointer: ">",
  214. checkboxOn: "[\xD7]",
  215. squareSmallFilled: "\u25A0"
  216. };
  217. var figures = isUnicodeSupported() ? FIGURES_MAIN : FIGURES_FALLBACK;
  218. // src/utils/format/splat.ts
  219. var import_util = require("util");
  220. function splat(message, ...splat2) {
  221. return (0, import_util.format)(String(message), ...splat2);
  222. }
  223. __name(splat, "splat");
  224. // src/utils/logger/logger.constants.ts
  225. var ListrLogLevels = /* @__PURE__ */ ((ListrLogLevels2) => {
  226. ListrLogLevels2["STARTED"] = "STARTED";
  227. ListrLogLevels2["COMPLETED"] = "COMPLETED";
  228. ListrLogLevels2["FAILED"] = "FAILED";
  229. ListrLogLevels2["SKIPPED"] = "SKIPPED";
  230. ListrLogLevels2["OUTPUT"] = "OUTPUT";
  231. ListrLogLevels2["TITLE"] = "TITLE";
  232. ListrLogLevels2["ROLLBACK"] = "ROLLBACK";
  233. ListrLogLevels2["RETRY"] = "RETRY";
  234. ListrLogLevels2["PROMPT"] = "PROMPT";
  235. ListrLogLevels2["PAUSED"] = "PAUSED";
  236. return ListrLogLevels2;
  237. })(ListrLogLevels || {});
  238. var LISTR_LOGGER_STYLE = {
  239. icon: {
  240. ["STARTED" /* STARTED */]: figures.pointer,
  241. ["FAILED" /* FAILED */]: figures.cross,
  242. ["SKIPPED" /* SKIPPED */]: figures.arrowDown,
  243. ["COMPLETED" /* COMPLETED */]: figures.tick,
  244. ["OUTPUT" /* OUTPUT */]: figures.pointerSmall,
  245. ["TITLE" /* TITLE */]: figures.arrowRight,
  246. ["RETRY" /* RETRY */]: figures.warning,
  247. ["ROLLBACK" /* ROLLBACK */]: figures.arrowLeft,
  248. ["PAUSED" /* PAUSED */]: figures.squareSmallFilled
  249. },
  250. color: {
  251. ["STARTED" /* STARTED */]: color.yellow,
  252. ["FAILED" /* FAILED */]: color.red,
  253. ["SKIPPED" /* SKIPPED */]: color.yellow,
  254. ["COMPLETED" /* COMPLETED */]: color.green,
  255. ["RETRY" /* RETRY */]: color.yellowBright,
  256. ["ROLLBACK" /* ROLLBACK */]: color.redBright,
  257. ["PAUSED" /* PAUSED */]: color.yellowBright
  258. }
  259. };
  260. var LISTR_LOGGER_STDERR_LEVELS = ["RETRY" /* RETRY */, "ROLLBACK" /* ROLLBACK */, "FAILED" /* FAILED */];
  261. // src/utils/logger/logger.ts
  262. var import_os = require("os");
  263. var _ListrLogger = class _ListrLogger {
  264. constructor(options) {
  265. this.options = options;
  266. this.options = {
  267. useIcons: true,
  268. toStderr: [],
  269. ...options ?? {}
  270. };
  271. this.options.fields ??= {};
  272. this.options.fields.prefix ??= [];
  273. this.options.fields.suffix ??= [];
  274. this.process = this.options.processOutput ?? new ProcessOutput();
  275. }
  276. log(level, message, options) {
  277. const output = this.format(level, message, options);
  278. if (this.options.toStderr.includes(level)) {
  279. this.process.toStderr(output);
  280. return;
  281. }
  282. this.process.toStdout(output);
  283. }
  284. toStdout(message, options, eol = true) {
  285. this.process.toStdout(this.format(null, message, options), eol);
  286. }
  287. toStderr(message, options, eol = true) {
  288. this.process.toStderr(this.format(null, message, options), eol);
  289. }
  290. wrap(message, options) {
  291. if (!message) {
  292. return message;
  293. }
  294. return this.applyFormat(`[${message}]`, options);
  295. }
  296. splat(...args) {
  297. const message = args.shift() ?? "";
  298. return args.length === 0 ? message : splat(message, args);
  299. }
  300. suffix(message, ...suffixes) {
  301. suffixes.filter(Boolean).forEach((suffix) => {
  302. message += this.spacing(message);
  303. if (typeof suffix === "string") {
  304. message += this.wrap(suffix);
  305. } else if (typeof suffix === "object") {
  306. suffix.args ??= [];
  307. if (typeof suffix.condition === "function" ? !suffix.condition(...suffix.args) : !(suffix.condition ?? true)) {
  308. return message;
  309. }
  310. message += this.wrap(typeof suffix.field === "function" ? suffix.field(...suffix.args) : suffix.field, {
  311. format: suffix?.format(...suffix.args)
  312. });
  313. }
  314. });
  315. return message;
  316. }
  317. prefix(message, ...prefixes) {
  318. prefixes.filter(Boolean).forEach((prefix) => {
  319. message = this.spacing(message) + message;
  320. if (typeof prefix === "string") {
  321. message = this.wrap(prefix) + message;
  322. } else if (typeof prefix === "object") {
  323. prefix.args ??= [];
  324. if (typeof prefix.condition === "function" ? !prefix.condition(...prefix.args) : !(prefix.condition ?? true)) {
  325. return message;
  326. }
  327. message = this.wrap(typeof prefix.field === "function" ? prefix.field(...prefix.args) : prefix.field, {
  328. format: prefix?.format()
  329. }) + message;
  330. }
  331. });
  332. return message;
  333. }
  334. fields(message, options) {
  335. if (this.options?.fields?.prefix) {
  336. message = this.prefix(message, ...this.options.fields.prefix);
  337. }
  338. if (options?.prefix) {
  339. message = this.prefix(message, ...options.prefix);
  340. }
  341. if (options?.suffix) {
  342. message = this.suffix(message, ...options.suffix);
  343. }
  344. if (this.options?.fields?.suffix) {
  345. message = this.suffix(message, ...this.options.fields.suffix);
  346. }
  347. return message;
  348. }
  349. icon(level, icon) {
  350. if (!level) {
  351. return null;
  352. }
  353. icon ||= this.options.icon?.[level];
  354. const coloring = this.options.color?.[level];
  355. if (icon && coloring) {
  356. icon = coloring(icon);
  357. }
  358. return icon;
  359. }
  360. format(level, message, options) {
  361. if (!Array.isArray(message)) {
  362. message = [message];
  363. }
  364. message = this.splat(message.shift(), ...message).toString().split(import_os.EOL).filter((m) => !m || m.trim() !== "").map((m) => {
  365. return this.style(
  366. level,
  367. this.fields(m, {
  368. prefix: Array.isArray(options?.prefix) ? options.prefix : [options?.prefix],
  369. suffix: Array.isArray(options?.suffix) ? options.suffix : [options?.suffix]
  370. })
  371. );
  372. }).join(import_os.EOL);
  373. return message;
  374. }
  375. style(level, message) {
  376. if (!level || !message) {
  377. return message;
  378. }
  379. const icon = this.icon(level, !this.options.useIcons && this.wrap(level));
  380. if (icon) {
  381. message = icon + " " + message;
  382. }
  383. return message;
  384. }
  385. applyFormat(message, options) {
  386. if (options?.format) {
  387. return options.format(message);
  388. }
  389. return message;
  390. }
  391. spacing(message) {
  392. return typeof message === "undefined" || message.trim() === "" ? "" : " ";
  393. }
  394. };
  395. __name(_ListrLogger, "ListrLogger");
  396. var ListrLogger = _ListrLogger;
  397. // src/utils/process-output/process-output-buffer.ts
  398. var import_string_decoder = require("string_decoder");
  399. var _ProcessOutputBuffer = class _ProcessOutputBuffer {
  400. constructor(options) {
  401. this.options = options;
  402. this.buffer = [];
  403. this.decoder = new import_string_decoder.StringDecoder();
  404. }
  405. get all() {
  406. return this.buffer;
  407. }
  408. get last() {
  409. return this.buffer.at(-1);
  410. }
  411. get length() {
  412. return this.buffer.length;
  413. }
  414. write(data, ...args) {
  415. const callback = args[args.length - 1];
  416. this.buffer.push({
  417. time: Date.now(),
  418. stream: this.options?.stream,
  419. entry: this.decoder.write(typeof data === "string" ? Buffer.from(data, typeof args[0] === "string" ? args[0] : void 0) : Buffer.from(data))
  420. });
  421. if (this.options?.limit) {
  422. this.buffer = this.buffer.slice(-this.options.limit);
  423. }
  424. if (typeof callback === "function") {
  425. callback();
  426. }
  427. return true;
  428. }
  429. reset() {
  430. this.buffer = [];
  431. }
  432. };
  433. __name(_ProcessOutputBuffer, "ProcessOutputBuffer");
  434. var ProcessOutputBuffer = _ProcessOutputBuffer;
  435. // src/utils/process-output/process-output-stream.ts
  436. var _ProcessOutputStream = class _ProcessOutputStream {
  437. constructor(stream) {
  438. this.stream = stream;
  439. this.method = stream.write;
  440. this.buffer = new ProcessOutputBuffer({ stream });
  441. }
  442. get out() {
  443. return Object.assign({}, this.stream, {
  444. write: this.write.bind(this)
  445. });
  446. }
  447. hijack() {
  448. this.stream.write = this.buffer.write.bind(this.buffer);
  449. }
  450. release() {
  451. this.stream.write = this.method;
  452. const buffer = [...this.buffer.all];
  453. this.buffer.reset();
  454. return buffer;
  455. }
  456. write(...args) {
  457. return this.method.apply(this.stream, args);
  458. }
  459. };
  460. __name(_ProcessOutputStream, "ProcessOutputStream");
  461. var ProcessOutputStream = _ProcessOutputStream;
  462. // src/utils/process-output/process-output.ts
  463. var import_os2 = require("os");
  464. var _ProcessOutput = class _ProcessOutput {
  465. constructor(stdout, stderr, options) {
  466. this.options = options;
  467. this.stream = {
  468. stdout: new ProcessOutputStream(stdout ?? process.stdout),
  469. stderr: new ProcessOutputStream(stderr ?? process.stderr)
  470. };
  471. this.options = {
  472. dump: ["stdout", "stderr"],
  473. leaveEmptyLine: true,
  474. ...options
  475. };
  476. }
  477. get stdout() {
  478. return this.stream.stdout.out;
  479. }
  480. get stderr() {
  481. return this.stream.stderr.out;
  482. }
  483. hijack() {
  484. if (this.active) {
  485. throw new Error("ProcessOutput has been already hijacked!");
  486. }
  487. this.stream.stdout.write(ANSI_ESCAPE_CODES.CURSOR_HIDE);
  488. Object.values(this.stream).forEach((stream) => stream.hijack());
  489. this.active = true;
  490. }
  491. release() {
  492. const output = Object.entries(this.stream).map(([name, stream]) => ({ name, buffer: stream.release() })).filter((output2) => this.options.dump.includes(output2.name)).flatMap((output2) => output2.buffer).sort((a, b) => a.time - b.time).map((message) => {
  493. return {
  494. ...message,
  495. entry: cleanseAnsi(message.entry)
  496. };
  497. }).filter((message) => message.entry);
  498. if (output.length > 0) {
  499. if (this.options.leaveEmptyLine) {
  500. this.stdout.write(import_os2.EOL);
  501. }
  502. output.forEach((message) => {
  503. const stream = message.stream ?? this.stdout;
  504. stream.write(message.entry + import_os2.EOL);
  505. });
  506. }
  507. this.stream.stdout.write(ANSI_ESCAPE_CODES.CURSOR_SHOW);
  508. this.active = false;
  509. }
  510. toStdout(buffer, eol = true) {
  511. if (eol) {
  512. buffer = buffer + import_os2.EOL;
  513. }
  514. return this.stream.stdout.write(buffer);
  515. }
  516. toStderr(buffer, eol = true) {
  517. if (eol) {
  518. buffer = buffer + import_os2.EOL;
  519. }
  520. return this.stream.stderr.write(buffer);
  521. }
  522. };
  523. __name(_ProcessOutput, "ProcessOutput");
  524. var ProcessOutput = _ProcessOutput;
  525. // src/utils/process-output/writable.ts
  526. var import_stream = require("stream");
  527. function createWritable(cb) {
  528. const writable = new import_stream.Writable();
  529. writable.write = (chunk) => {
  530. cb(chunk.toString());
  531. return true;
  532. };
  533. return writable;
  534. }
  535. __name(createWritable, "createWritable");
  536. // src/utils/ui/spinner.ts
  537. var _Spinner = class _Spinner {
  538. constructor() {
  539. this.spinner = !isUnicodeSupported() ? ["-", "\\", "|", "/"] : ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
  540. this.spinnerPosition = 0;
  541. }
  542. spin() {
  543. this.spinnerPosition = ++this.spinnerPosition % this.spinner.length;
  544. }
  545. fetch() {
  546. return this.spinner[this.spinnerPosition];
  547. }
  548. isRunning() {
  549. return !!this.id;
  550. }
  551. start(cb, interval = 100) {
  552. this.id = setInterval(() => {
  553. this.spin();
  554. if (cb) {
  555. cb();
  556. }
  557. }, interval);
  558. }
  559. stop() {
  560. clearInterval(this.id);
  561. }
  562. };
  563. __name(_Spinner, "Spinner");
  564. var Spinner = _Spinner;
  565. // src/utils/ui/prompt.ts
  566. async function createPrompt(options, settings) {
  567. settings = {
  568. ...settings
  569. };
  570. if (!Array.isArray(options)) {
  571. options = [{ ...options, name: "default" }];
  572. } else if (options.length === 1) {
  573. options = options.map((option) => {
  574. return { ...option, name: "default" };
  575. });
  576. }
  577. options = options.map((option) => {
  578. return {
  579. onCancel: () => {
  580. const error = new PromptError("Cancelled prompt.");
  581. if (this instanceof TaskWrapper) {
  582. this.task.prompt = error;
  583. } else {
  584. throw error;
  585. }
  586. return true;
  587. },
  588. ...option,
  589. // this is for outside calls, if it is not called from taskwrapper with bind
  590. stdout: this instanceof TaskWrapper ? settings?.stdout ?? this.stdout("PROMPT" /* PROMPT */) : process.stdout
  591. };
  592. });
  593. let enquirer;
  594. if (settings?.enquirer) {
  595. enquirer = settings.enquirer;
  596. } else {
  597. try {
  598. enquirer = await import("enquirer").then((imported) => imported.default ? new imported.default() : new imported());
  599. } catch (e) {
  600. if (this instanceof TaskWrapper) {
  601. this.task.prompt = new PromptError("Enquirer is a peer dependency that must be installed separately.");
  602. }
  603. throw e;
  604. }
  605. }
  606. let state;
  607. if (this instanceof TaskWrapper) {
  608. state = this.task.state;
  609. this.task.state$ = "PROMPT" /* PROMPT */;
  610. enquirer.on("prompt", (prompt) => this.task.prompt = prompt).on("submit", () => this.task.prompt = void 0);
  611. this.task.on("STATE" /* STATE */, (event) => {
  612. if (event === "SKIPPED" /* SKIPPED */ && this.task.prompt && !(this.task.prompt instanceof PromptError)) {
  613. this.task.prompt.submit();
  614. }
  615. });
  616. }
  617. const response = await enquirer.prompt(options);
  618. if (this instanceof TaskWrapper) {
  619. this.task.state$ = "PROMPT_COMPLETED" /* PROMPT_COMPLETED */;
  620. this.task.state = state;
  621. }
  622. if (options.length === 1) {
  623. return response.default;
  624. } else {
  625. return response;
  626. }
  627. }
  628. __name(createPrompt, "createPrompt");
  629. // src/renderer/default/renderer.constants.ts
  630. var ListrDefaultRendererLogLevels = /* @__PURE__ */ ((ListrDefaultRendererLogLevels2) => {
  631. ListrDefaultRendererLogLevels2["SKIPPED_WITH_COLLAPSE"] = "SKIPPED_WITH_COLLAPSE";
  632. ListrDefaultRendererLogLevels2["SKIPPED_WITHOUT_COLLAPSE"] = "SKIPPED_WITHOUT_COLLAPSE";
  633. ListrDefaultRendererLogLevels2["OUTPUT"] = "OUTPUT";
  634. ListrDefaultRendererLogLevels2["OUTPUT_WITH_BOTTOMBAR"] = "OUTPUT_WITH_BOTTOMBAR";
  635. ListrDefaultRendererLogLevels2["PENDING"] = "PENDING";
  636. ListrDefaultRendererLogLevels2["COMPLETED"] = "COMPLETED";
  637. ListrDefaultRendererLogLevels2["COMPLETED_WITH_FAILED_SUBTASKS"] = "COMPLETED_WITH_FAILED_SUBTASKS";
  638. ListrDefaultRendererLogLevels2["COMPLETED_WITH_FAILED_SISTER_TASKS"] = "COMPLETED_WITH_SISTER_TASKS_FAILED";
  639. ListrDefaultRendererLogLevels2["RETRY"] = "RETRY";
  640. ListrDefaultRendererLogLevels2["ROLLING_BACK"] = "ROLLING_BACK";
  641. ListrDefaultRendererLogLevels2["ROLLED_BACK"] = "ROLLED_BACK";
  642. ListrDefaultRendererLogLevels2["FAILED"] = "FAILED";
  643. ListrDefaultRendererLogLevels2["FAILED_WITH_FAILED_SUBTASKS"] = "FAILED_WITH_SUBTASKS";
  644. ListrDefaultRendererLogLevels2["WAITING"] = "WAITING";
  645. ListrDefaultRendererLogLevels2["PAUSED"] = "PAUSED";
  646. return ListrDefaultRendererLogLevels2;
  647. })(ListrDefaultRendererLogLevels || {});
  648. var LISTR_DEFAULT_RENDERER_STYLE = {
  649. icon: {
  650. ["SKIPPED_WITH_COLLAPSE" /* SKIPPED_WITH_COLLAPSE */]: figures.arrowDown,
  651. ["SKIPPED_WITHOUT_COLLAPSE" /* SKIPPED_WITHOUT_COLLAPSE */]: figures.warning,
  652. ["OUTPUT" /* OUTPUT */]: figures.pointerSmall,
  653. ["OUTPUT_WITH_BOTTOMBAR" /* OUTPUT_WITH_BOTTOMBAR */]: figures.pointerSmall,
  654. ["PENDING" /* PENDING */]: figures.pointer,
  655. ["COMPLETED" /* COMPLETED */]: figures.tick,
  656. ["COMPLETED_WITH_FAILED_SUBTASKS" /* COMPLETED_WITH_FAILED_SUBTASKS */]: figures.warning,
  657. ["COMPLETED_WITH_SISTER_TASKS_FAILED" /* COMPLETED_WITH_FAILED_SISTER_TASKS */]: figures.squareSmallFilled,
  658. ["RETRY" /* RETRY */]: figures.warning,
  659. ["ROLLING_BACK" /* ROLLING_BACK */]: figures.warning,
  660. ["ROLLED_BACK" /* ROLLED_BACK */]: figures.arrowLeft,
  661. ["FAILED" /* FAILED */]: figures.cross,
  662. ["FAILED_WITH_SUBTASKS" /* FAILED_WITH_FAILED_SUBTASKS */]: figures.pointer,
  663. ["WAITING" /* WAITING */]: figures.squareSmallFilled,
  664. ["PAUSED" /* PAUSED */]: figures.squareSmallFilled
  665. },
  666. color: {
  667. ["SKIPPED_WITH_COLLAPSE" /* SKIPPED_WITH_COLLAPSE */]: color.yellow,
  668. ["SKIPPED_WITHOUT_COLLAPSE" /* SKIPPED_WITHOUT_COLLAPSE */]: color.yellow,
  669. ["PENDING" /* PENDING */]: color.yellow,
  670. ["COMPLETED" /* COMPLETED */]: color.green,
  671. ["COMPLETED_WITH_FAILED_SUBTASKS" /* COMPLETED_WITH_FAILED_SUBTASKS */]: color.yellow,
  672. ["COMPLETED_WITH_SISTER_TASKS_FAILED" /* COMPLETED_WITH_FAILED_SISTER_TASKS */]: color.red,
  673. ["RETRY" /* RETRY */]: color.yellowBright,
  674. ["ROLLING_BACK" /* ROLLING_BACK */]: color.redBright,
  675. ["ROLLED_BACK" /* ROLLED_BACK */]: color.redBright,
  676. ["FAILED" /* FAILED */]: color.red,
  677. ["FAILED_WITH_SUBTASKS" /* FAILED_WITH_FAILED_SUBTASKS */]: color.red,
  678. ["WAITING" /* WAITING */]: color.dim,
  679. ["PAUSED" /* PAUSED */]: color.yellowBright
  680. }
  681. };
  682. // src/renderer/default/renderer.ts
  683. var import_os3 = require("os");
  684. // src/presets/timer/parser.ts
  685. function parseTimer(duration) {
  686. const seconds = Math.floor(duration / 1e3);
  687. const minutes = Math.floor(seconds / 60);
  688. let parsedTime;
  689. if (seconds === 0 && minutes === 0) {
  690. parsedTime = `0.${Math.floor(duration / 100)}s`;
  691. }
  692. if (seconds > 0) {
  693. parsedTime = `${seconds % 60}s`;
  694. }
  695. if (minutes > 0) {
  696. parsedTime = `${minutes}m${parsedTime}`;
  697. }
  698. return parsedTime;
  699. }
  700. __name(parseTimer, "parseTimer");
  701. // src/presets/timer/preset.ts
  702. var PRESET_TIMER = {
  703. condition: true,
  704. field: parseTimer,
  705. format: () => color.dim
  706. };
  707. // src/presets/timestamp/parser.ts
  708. function parseTimestamp() {
  709. const now = /* @__PURE__ */ new Date();
  710. return String(now.getHours()).padStart(2, "0") + ":" + String(now.getMinutes()).padStart(2, "0") + ":" + String(now.getSeconds()).padStart(2, "0");
  711. }
  712. __name(parseTimestamp, "parseTimestamp");
  713. // src/presets/timestamp/preset.ts
  714. var PRESET_TIMESTAMP = {
  715. condition: true,
  716. field: parseTimestamp,
  717. format: () => color.dim
  718. };
  719. // src/renderer/default/renderer.ts
  720. var _DefaultRenderer = class _DefaultRenderer {
  721. constructor(tasks, options, events) {
  722. this.tasks = tasks;
  723. this.options = options;
  724. this.events = events;
  725. this.bottom = /* @__PURE__ */ new Map();
  726. this.cache = {
  727. output: /* @__PURE__ */ new Map(),
  728. rendererOptions: /* @__PURE__ */ new Map(),
  729. rendererTaskOptions: /* @__PURE__ */ new Map()
  730. };
  731. this.options = {
  732. ..._DefaultRenderer.rendererOptions,
  733. ...this.options,
  734. icon: {
  735. ...LISTR_DEFAULT_RENDERER_STYLE.icon,
  736. ...options?.icon ?? {}
  737. },
  738. color: {
  739. ...LISTR_DEFAULT_RENDERER_STYLE.color,
  740. ...options?.color ?? {}
  741. }
  742. };
  743. this.spinner = this.options.spinner ?? new Spinner();
  744. this.logger = this.options.logger ?? new ListrLogger({ useIcons: true, toStderr: [] });
  745. this.logger.options.icon = this.options.icon;
  746. this.logger.options.color = this.options.color;
  747. }
  748. isBottomBar(task) {
  749. const bottomBar = this.cache.rendererTaskOptions.get(task.id).bottomBar;
  750. return typeof bottomBar === "number" && bottomBar !== 0 || typeof bottomBar === "boolean" && bottomBar !== false || !task.hasTitle();
  751. }
  752. async render() {
  753. const { createLogUpdate } = await import("log-update");
  754. const { default: truncate } = await import("cli-truncate");
  755. const { default: wrap } = await import("wrap-ansi");
  756. this.updater = createLogUpdate(this.logger.process.stdout);
  757. this.truncate = truncate;
  758. this.wrap = wrap;
  759. this.logger.process.hijack();
  760. if (!this.options?.lazy) {
  761. this.spinner.start(() => {
  762. this.update();
  763. });
  764. }
  765. this.events.on("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */, () => {
  766. this.update();
  767. });
  768. }
  769. update() {
  770. this.updater(this.create());
  771. }
  772. end() {
  773. this.spinner.stop();
  774. this.updater.clear();
  775. this.updater.done();
  776. if (!this.options.clearOutput) {
  777. this.logger.process.toStdout(this.create({ prompt: false }));
  778. }
  779. this.logger.process.release();
  780. }
  781. create(options) {
  782. options = {
  783. tasks: true,
  784. bottomBar: true,
  785. prompt: true,
  786. ...options
  787. };
  788. const render = [];
  789. const renderTasks = this.renderer(this.tasks);
  790. const renderBottomBar = this.renderBottomBar();
  791. const renderPrompt = this.renderPrompt();
  792. if (options.tasks && renderTasks.length > 0) {
  793. render.push(...renderTasks);
  794. }
  795. if (options.bottomBar && renderBottomBar.length > 0) {
  796. if (render.length > 0) {
  797. render.push("");
  798. }
  799. render.push(...renderBottomBar);
  800. }
  801. if (options.prompt && renderPrompt.length > 0) {
  802. if (render.length > 0) {
  803. render.push("");
  804. }
  805. render.push(...renderPrompt);
  806. }
  807. return render.join(import_os3.EOL);
  808. }
  809. // eslint-disable-next-line complexity
  810. style(task, output = false) {
  811. const rendererOptions = this.cache.rendererOptions.get(task.id);
  812. if (task.isSkipped()) {
  813. if (output || rendererOptions.collapseSkips) {
  814. return this.logger.icon("SKIPPED_WITH_COLLAPSE" /* SKIPPED_WITH_COLLAPSE */);
  815. } else if (rendererOptions.collapseSkips === false) {
  816. return this.logger.icon("SKIPPED_WITHOUT_COLLAPSE" /* SKIPPED_WITHOUT_COLLAPSE */);
  817. }
  818. }
  819. if (output) {
  820. if (this.isBottomBar(task)) {
  821. return this.logger.icon("OUTPUT_WITH_BOTTOMBAR" /* OUTPUT_WITH_BOTTOMBAR */);
  822. }
  823. return this.logger.icon("OUTPUT" /* OUTPUT */);
  824. }
  825. if (task.hasSubtasks()) {
  826. if (task.isStarted() || task.isPrompt() && rendererOptions.showSubtasks !== false && !task.subtasks.every((subtask) => !subtask.hasTitle())) {
  827. return this.logger.icon("PENDING" /* PENDING */);
  828. } else if (task.isCompleted() && task.subtasks.some((subtask) => subtask.hasFailed())) {
  829. return this.logger.icon("COMPLETED_WITH_FAILED_SUBTASKS" /* COMPLETED_WITH_FAILED_SUBTASKS */);
  830. } else if (task.hasFailed()) {
  831. return this.logger.icon("FAILED_WITH_SUBTASKS" /* FAILED_WITH_FAILED_SUBTASKS */);
  832. }
  833. }
  834. if (task.isStarted() || task.isPrompt()) {
  835. return this.logger.icon("PENDING" /* PENDING */, !this.options?.lazy && this.spinner.fetch());
  836. } else if (task.isCompleted()) {
  837. return this.logger.icon("COMPLETED" /* COMPLETED */);
  838. } else if (task.isRetrying()) {
  839. return this.logger.icon("RETRY" /* RETRY */, !this.options?.lazy && this.spinner.fetch());
  840. } else if (task.isRollingBack()) {
  841. return this.logger.icon("ROLLING_BACK" /* ROLLING_BACK */, !this.options?.lazy && this.spinner.fetch());
  842. } else if (task.hasRolledBack()) {
  843. return this.logger.icon("ROLLED_BACK" /* ROLLED_BACK */);
  844. } else if (task.hasFailed()) {
  845. return this.logger.icon("FAILED" /* FAILED */);
  846. } else if (task.isPaused()) {
  847. return this.logger.icon("PAUSED" /* PAUSED */);
  848. }
  849. return this.logger.icon("WAITING" /* WAITING */);
  850. }
  851. format(message, icon, level) {
  852. if (message.trim() === "") {
  853. return [];
  854. }
  855. if (icon) {
  856. message = icon + " " + message;
  857. }
  858. let parsed;
  859. const columns = (process.stdout.columns ?? 80) - level * this.options.indentation - 2;
  860. switch (this.options.formatOutput) {
  861. case "truncate":
  862. parsed = message.split(import_os3.EOL).map((s, i) => {
  863. return this.truncate(this.indent(s, i), columns);
  864. });
  865. break;
  866. case "wrap":
  867. parsed = this.wrap(message, columns, { hard: true }).split(import_os3.EOL).map((s, i) => this.indent(s, i));
  868. break;
  869. default:
  870. throw new ListrRendererError("Format option for the renderer is wrong.");
  871. }
  872. if (this.options.removeEmptyLines) {
  873. parsed = parsed.filter(Boolean);
  874. }
  875. return parsed.map((str) => indent(str, level * this.options.indentation));
  876. }
  877. renderer(tasks, level = 0) {
  878. return tasks.flatMap((task) => {
  879. if (!task.isEnabled()) {
  880. return [];
  881. }
  882. if (this.cache.output.has(task.id)) {
  883. return this.cache.output.get(task.id);
  884. }
  885. this.calculate(task);
  886. const rendererOptions = this.cache.rendererOptions.get(task.id);
  887. const rendererTaskOptions = this.cache.rendererTaskOptions.get(task.id);
  888. const output = [];
  889. if (task.isPrompt()) {
  890. if (this.activePrompt && this.activePrompt !== task.id) {
  891. throw new ListrRendererError("Only one prompt can be active at the given time, please re-evaluate your task design.");
  892. } else if (!this.activePrompt) {
  893. task.on("PROMPT" /* PROMPT */, (prompt) => {
  894. const cleansed = cleanseAnsi(prompt);
  895. if (cleansed) {
  896. this.prompt = cleansed;
  897. }
  898. });
  899. task.on("STATE" /* STATE */, (state) => {
  900. if (state === "PROMPT_COMPLETED" /* PROMPT_COMPLETED */ || task.hasFinalized() || task.hasReset()) {
  901. this.prompt = null;
  902. this.activePrompt = null;
  903. task.off("PROMPT" /* PROMPT */);
  904. }
  905. });
  906. this.activePrompt = task.id;
  907. }
  908. }
  909. if (task.hasTitle()) {
  910. if (!(tasks.some((task2) => task2.hasFailed()) && !task.hasFailed() && task.options.exitOnError !== false && !(task.isCompleted() || task.isSkipped()))) {
  911. if (task.hasFailed() && rendererOptions.collapseErrors) {
  912. output.push(...this.format(!task.hasSubtasks() && task.message.error && rendererOptions.showErrorMessage ? task.message.error : task.title, this.style(task), level));
  913. } else if (task.isSkipped() && rendererOptions.collapseSkips) {
  914. output.push(
  915. ...this.format(
  916. this.logger.suffix(task.message.skip && rendererOptions.showSkipMessage ? task.message.skip : task.title, {
  917. field: "SKIPPED" /* SKIPPED */,
  918. condition: rendererOptions.suffixSkips,
  919. format: () => color.dim
  920. }),
  921. this.style(task),
  922. level
  923. )
  924. );
  925. } else if (task.isRetrying()) {
  926. output.push(
  927. ...this.format(
  928. this.logger.suffix(task.title, {
  929. field: `${"RETRY" /* RETRY */}:${task.message.retry.count}`,
  930. format: () => color.yellow,
  931. condition: rendererOptions.suffixRetries
  932. }),
  933. this.style(task),
  934. level
  935. )
  936. );
  937. } else if (task.isCompleted() && task.hasTitle() && assertFunctionOrSelf(rendererTaskOptions.timer?.condition, task.message.duration)) {
  938. output.push(
  939. ...this.format(
  940. this.logger.suffix(task?.title, {
  941. ...rendererTaskOptions.timer,
  942. args: [task.message.duration]
  943. }),
  944. this.style(task),
  945. level
  946. )
  947. );
  948. } else if (task.isPaused()) {
  949. output.push(
  950. ...this.format(
  951. this.logger.suffix(task.title, {
  952. ...rendererOptions.pausedTimer,
  953. args: [task.message.paused - Date.now()]
  954. }),
  955. this.style(task),
  956. level
  957. )
  958. );
  959. } else {
  960. output.push(...this.format(task.title, this.style(task), level));
  961. }
  962. } else {
  963. output.push(...this.format(task.title, this.logger.icon("COMPLETED_WITH_SISTER_TASKS_FAILED" /* COMPLETED_WITH_FAILED_SISTER_TASKS */), level));
  964. }
  965. }
  966. if (!task.hasSubtasks() || !rendererOptions.showSubtasks) {
  967. if (task.hasFailed() && rendererOptions.collapseErrors === false && (rendererOptions.showErrorMessage || !rendererOptions.showSubtasks)) {
  968. output.push(...this.dump(task, level, "FAILED" /* FAILED */));
  969. } else if (task.isSkipped() && rendererOptions.collapseSkips === false && (rendererOptions.showSkipMessage || !rendererOptions.showSubtasks)) {
  970. output.push(...this.dump(task, level, "SKIPPED" /* SKIPPED */));
  971. }
  972. }
  973. if (task?.output) {
  974. if (this.isBottomBar(task)) {
  975. if (!this.bottom.has(task.id)) {
  976. this.bottom.set(task.id, new ProcessOutputBuffer({ limit: typeof rendererTaskOptions.bottomBar === "boolean" ? 1 : rendererTaskOptions.bottomBar }));
  977. task.on("OUTPUT" /* OUTPUT */, (output2) => {
  978. const data = this.dump(task, -1, "OUTPUT" /* OUTPUT */, output2);
  979. this.bottom.get(task.id).write(data.join(import_os3.EOL));
  980. });
  981. }
  982. } else if (task.isPending() || rendererTaskOptions.persistentOutput) {
  983. output.push(...this.dump(task, level));
  984. }
  985. }
  986. if (
  987. // check if renderer option is on first
  988. rendererOptions.showSubtasks !== false && // if it doesnt have subtasks no need to check
  989. task.hasSubtasks() && (task.isPending() || task.hasFinalized() && !task.hasTitle() || // have to be completed and have subtasks
  990. task.isCompleted() && rendererOptions.collapseSubtasks === false && !task.subtasks.some((subtask) => subtask.rendererOptions.collapseSubtasks === true) || // if any of the subtasks have the collapse option of
  991. task.subtasks.some((subtask) => subtask.rendererOptions.collapseSubtasks === false) || // if any of the subtasks has failed
  992. task.subtasks.some((subtask) => subtask.hasFailed()) || // if any of the subtasks rolled back
  993. task.subtasks.some((subtask) => subtask.hasRolledBack()))
  994. ) {
  995. const subtaskLevel = !task.hasTitle() ? level : level + 1;
  996. const subtaskRender = this.renderer(task.subtasks, subtaskLevel);
  997. output.push(...subtaskRender);
  998. }
  999. if (task.hasFinalized()) {
  1000. if (!rendererTaskOptions.persistentOutput) {
  1001. this.bottom.delete(task.id);
  1002. }
  1003. }
  1004. if (task.isClosed()) {
  1005. this.cache.output.set(task.id, output);
  1006. this.reset(task);
  1007. }
  1008. return output;
  1009. });
  1010. }
  1011. renderBottomBar() {
  1012. if (this.bottom.size === 0) {
  1013. return [];
  1014. }
  1015. return Array.from(this.bottom.values()).flatMap((output) => output.all).sort((a, b) => a.time - b.time).map((output) => output.entry);
  1016. }
  1017. renderPrompt() {
  1018. if (!this.prompt) {
  1019. return [];
  1020. }
  1021. return [this.prompt];
  1022. }
  1023. calculate(task) {
  1024. if (this.cache.rendererOptions.has(task.id) && this.cache.rendererTaskOptions.has(task.id)) {
  1025. return;
  1026. }
  1027. const rendererOptions = {
  1028. ...this.options,
  1029. ...task.rendererOptions
  1030. };
  1031. this.cache.rendererOptions.set(task.id, rendererOptions);
  1032. this.cache.rendererTaskOptions.set(task.id, {
  1033. ..._DefaultRenderer.rendererTaskOptions,
  1034. timer: rendererOptions.timer,
  1035. ...task.rendererTaskOptions
  1036. });
  1037. }
  1038. reset(task) {
  1039. this.cache.rendererOptions.delete(task.id);
  1040. this.cache.rendererTaskOptions.delete(task.id);
  1041. }
  1042. dump(task, level, source = "OUTPUT" /* OUTPUT */, data) {
  1043. if (!data) {
  1044. switch (source) {
  1045. case "OUTPUT" /* OUTPUT */:
  1046. data = task.output;
  1047. break;
  1048. case "SKIPPED" /* SKIPPED */:
  1049. data = task.message.skip;
  1050. break;
  1051. case "FAILED" /* FAILED */:
  1052. data = task.message.error;
  1053. break;
  1054. }
  1055. }
  1056. if (task.hasTitle() && source === "FAILED" /* FAILED */ && data === task.title || typeof data !== "string") {
  1057. return [];
  1058. }
  1059. if (source === "OUTPUT" /* OUTPUT */) {
  1060. data = cleanseAnsi(data);
  1061. }
  1062. return this.format(data, this.style(task, true), level + 1);
  1063. }
  1064. indent(str, i) {
  1065. return i > 0 ? indent(str.trim(), this.options.indentation) : str.trim();
  1066. }
  1067. };
  1068. __name(_DefaultRenderer, "DefaultRenderer");
  1069. _DefaultRenderer.nonTTY = false;
  1070. _DefaultRenderer.rendererOptions = {
  1071. indentation: 2,
  1072. clearOutput: false,
  1073. showSubtasks: true,
  1074. collapseSubtasks: true,
  1075. collapseSkips: true,
  1076. showSkipMessage: true,
  1077. suffixSkips: false,
  1078. collapseErrors: true,
  1079. showErrorMessage: true,
  1080. suffixRetries: true,
  1081. lazy: false,
  1082. removeEmptyLines: true,
  1083. formatOutput: "wrap",
  1084. pausedTimer: {
  1085. ...PRESET_TIMER,
  1086. format: () => color.yellowBright
  1087. }
  1088. };
  1089. var DefaultRenderer = _DefaultRenderer;
  1090. // src/renderer/silent/renderer.ts
  1091. var _SilentRenderer = class _SilentRenderer {
  1092. constructor(tasks, options) {
  1093. this.tasks = tasks;
  1094. this.options = options;
  1095. }
  1096. render() {
  1097. return;
  1098. }
  1099. end() {
  1100. return;
  1101. }
  1102. };
  1103. __name(_SilentRenderer, "SilentRenderer");
  1104. _SilentRenderer.nonTTY = true;
  1105. var SilentRenderer = _SilentRenderer;
  1106. // src/renderer/simple/renderer.ts
  1107. var _SimpleRenderer = class _SimpleRenderer {
  1108. constructor(tasks, options) {
  1109. this.tasks = tasks;
  1110. this.options = options;
  1111. this.cache = {
  1112. rendererOptions: /* @__PURE__ */ new Map(),
  1113. rendererTaskOptions: /* @__PURE__ */ new Map()
  1114. };
  1115. this.options = {
  1116. ..._SimpleRenderer.rendererOptions,
  1117. ...options,
  1118. icon: {
  1119. ...LISTR_LOGGER_STYLE.icon,
  1120. ...options?.icon ?? {}
  1121. },
  1122. color: {
  1123. ...LISTR_LOGGER_STYLE.color,
  1124. ...options?.color ?? {}
  1125. }
  1126. };
  1127. this.logger = this.options.logger ?? new ListrLogger({ useIcons: true, toStderr: LISTR_LOGGER_STDERR_LEVELS });
  1128. this.logger.options.icon = this.options.icon;
  1129. this.logger.options.color = this.options.color;
  1130. if (this.options.timestamp) {
  1131. this.logger.options.fields.prefix.unshift(this.options.timestamp);
  1132. }
  1133. }
  1134. end() {
  1135. this.logger.process.release();
  1136. }
  1137. render() {
  1138. this.renderer(this.tasks);
  1139. }
  1140. renderer(tasks) {
  1141. tasks.forEach((task) => {
  1142. this.calculate(task);
  1143. task.once("CLOSED" /* CLOSED */, () => {
  1144. this.reset(task);
  1145. });
  1146. const rendererOptions = this.cache.rendererOptions.get(task.id);
  1147. const rendererTaskOptions = this.cache.rendererTaskOptions.get(task.id);
  1148. task.on("SUBTASK" /* SUBTASK */, (subtasks) => {
  1149. this.renderer(subtasks);
  1150. });
  1151. task.on("STATE" /* STATE */, (state) => {
  1152. if (!task.hasTitle()) {
  1153. return;
  1154. }
  1155. if (state === "STARTED" /* STARTED */) {
  1156. this.logger.log("STARTED" /* STARTED */, task.title);
  1157. } else if (state === "COMPLETED" /* COMPLETED */) {
  1158. const timer = rendererTaskOptions?.timer;
  1159. this.logger.log(
  1160. "COMPLETED" /* COMPLETED */,
  1161. task.title,
  1162. timer && {
  1163. suffix: {
  1164. ...timer,
  1165. condition: !!task.message?.duration && timer.condition,
  1166. args: [task.message.duration]
  1167. }
  1168. }
  1169. );
  1170. } else if (state === "PROMPT" /* PROMPT */) {
  1171. this.logger.process.hijack();
  1172. task.on("PROMPT" /* PROMPT */, (prompt) => {
  1173. this.logger.process.toStderr(prompt, false);
  1174. });
  1175. } else if (state === "PROMPT_COMPLETED" /* PROMPT_COMPLETED */) {
  1176. task.off("PROMPT" /* PROMPT */);
  1177. this.logger.process.release();
  1178. }
  1179. });
  1180. task.on("OUTPUT" /* OUTPUT */, (output) => {
  1181. this.logger.log("OUTPUT" /* OUTPUT */, output);
  1182. });
  1183. task.on("MESSAGE" /* MESSAGE */, (message) => {
  1184. if (message.error) {
  1185. this.logger.log("FAILED" /* FAILED */, task.title, {
  1186. suffix: {
  1187. field: `${"FAILED" /* FAILED */}: ${message.error}`,
  1188. format: () => color.red
  1189. }
  1190. });
  1191. } else if (message.skip) {
  1192. this.logger.log("SKIPPED" /* SKIPPED */, task.title, {
  1193. suffix: {
  1194. field: `${"SKIPPED" /* SKIPPED */}: ${message.skip}`,
  1195. format: () => color.yellow
  1196. }
  1197. });
  1198. } else if (message.rollback) {
  1199. this.logger.log("ROLLBACK" /* ROLLBACK */, task.title, {
  1200. suffix: {
  1201. field: `${"ROLLBACK" /* ROLLBACK */}: ${message.rollback}`,
  1202. format: () => color.red
  1203. }
  1204. });
  1205. } else if (message.retry) {
  1206. this.logger.log("RETRY" /* RETRY */, task.title, {
  1207. suffix: {
  1208. field: `${"RETRY" /* RETRY */}:${message.retry.count}`,
  1209. format: () => color.red
  1210. }
  1211. });
  1212. } else if (message.paused) {
  1213. const timer = rendererOptions?.pausedTimer;
  1214. this.logger.log(
  1215. "PAUSED" /* PAUSED */,
  1216. task.title,
  1217. timer && {
  1218. suffix: {
  1219. ...timer,
  1220. condition: !!message?.paused && timer.condition,
  1221. args: [message.paused - Date.now()]
  1222. }
  1223. }
  1224. );
  1225. }
  1226. });
  1227. });
  1228. }
  1229. calculate(task) {
  1230. if (this.cache.rendererOptions.has(task.id) && this.cache.rendererTaskOptions.has(task.id)) {
  1231. return;
  1232. }
  1233. const rendererOptions = {
  1234. ...this.options,
  1235. ...task.rendererOptions
  1236. };
  1237. this.cache.rendererOptions.set(task.id, rendererOptions);
  1238. this.cache.rendererTaskOptions.set(task.id, {
  1239. ..._SimpleRenderer.rendererTaskOptions,
  1240. timer: rendererOptions.timer,
  1241. ...task.rendererTaskOptions
  1242. });
  1243. }
  1244. reset(task) {
  1245. this.cache.rendererOptions.delete(task.id);
  1246. this.cache.rendererTaskOptions.delete(task.id);
  1247. }
  1248. };
  1249. __name(_SimpleRenderer, "SimpleRenderer");
  1250. _SimpleRenderer.nonTTY = true;
  1251. _SimpleRenderer.rendererOptions = {
  1252. pausedTimer: {
  1253. ...PRESET_TIMER,
  1254. field: (time) => `${"PAUSED" /* PAUSED */}:${time}`,
  1255. format: () => color.yellowBright
  1256. }
  1257. };
  1258. _SimpleRenderer.rendererTaskOptions = {};
  1259. var SimpleRenderer = _SimpleRenderer;
  1260. // src/renderer/test/serializer.ts
  1261. var _TestRendererSerializer = class _TestRendererSerializer {
  1262. constructor(options) {
  1263. this.options = options;
  1264. }
  1265. serialize(event, data, task) {
  1266. return JSON.stringify(this.generate(event, data, task));
  1267. }
  1268. generate(event, data, task) {
  1269. const output = {
  1270. event,
  1271. data
  1272. };
  1273. if (typeof this.options?.task !== "boolean") {
  1274. const t = Object.fromEntries(
  1275. this.options.task.map((entity) => {
  1276. const property = task[entity];
  1277. if (typeof property === "function") {
  1278. return [entity, property.call(task)];
  1279. }
  1280. return [entity, property];
  1281. })
  1282. );
  1283. if (Object.keys(task).length > 0) {
  1284. output.task = t;
  1285. }
  1286. }
  1287. return output;
  1288. }
  1289. };
  1290. __name(_TestRendererSerializer, "TestRendererSerializer");
  1291. var TestRendererSerializer = _TestRendererSerializer;
  1292. // src/renderer/test/renderer.ts
  1293. var _TestRenderer = class _TestRenderer {
  1294. constructor(tasks, options) {
  1295. this.tasks = tasks;
  1296. this.options = options;
  1297. this.options = { ..._TestRenderer.rendererOptions, ...this.options };
  1298. this.logger = this.options.logger ?? new ListrLogger({ useIcons: false });
  1299. this.serializer = new TestRendererSerializer(this.options);
  1300. }
  1301. render() {
  1302. this.renderer(this.tasks);
  1303. }
  1304. // eslint-disable-next-line @typescript-eslint/no-empty-function
  1305. end() {
  1306. }
  1307. // verbose renderer multi-level
  1308. renderer(tasks) {
  1309. tasks.forEach((task) => {
  1310. if (this.options.subtasks) {
  1311. task.on("SUBTASK" /* SUBTASK */, (subtasks) => {
  1312. this.renderer(subtasks);
  1313. });
  1314. }
  1315. if (this.options.state) {
  1316. task.on("STATE" /* STATE */, (state) => {
  1317. this.logger.toStdout(this.serializer.serialize("STATE" /* STATE */, state, task));
  1318. });
  1319. }
  1320. if (this.options.output) {
  1321. task.on("OUTPUT" /* OUTPUT */, (data) => {
  1322. this.logger.toStdout(this.serializer.serialize("OUTPUT" /* OUTPUT */, data, task));
  1323. });
  1324. }
  1325. if (this.options.prompt) {
  1326. task.on("PROMPT" /* PROMPT */, (prompt) => {
  1327. this.logger.toStdout(this.serializer.serialize("PROMPT" /* PROMPT */, prompt, task));
  1328. });
  1329. }
  1330. if (this.options.title) {
  1331. task.on("TITLE" /* TITLE */, (title) => {
  1332. this.logger.toStdout(this.serializer.serialize("TITLE" /* TITLE */, title, task));
  1333. });
  1334. }
  1335. task.on("MESSAGE" /* MESSAGE */, (message) => {
  1336. const parsed = Object.fromEntries(
  1337. Object.entries(message).map(([key, value]) => {
  1338. if (this.options.messages.includes(key)) {
  1339. return [key, value];
  1340. }
  1341. }).filter(Boolean)
  1342. );
  1343. if (Object.keys(parsed).length > 0) {
  1344. const output = this.serializer.serialize("MESSAGE" /* MESSAGE */, parsed, task);
  1345. if (this.options.messagesToStderr.some((state) => Object.keys(parsed).includes(state))) {
  1346. this.logger.toStderr(output);
  1347. } else {
  1348. this.logger.toStdout(output);
  1349. }
  1350. }
  1351. });
  1352. });
  1353. }
  1354. };
  1355. __name(_TestRenderer, "TestRenderer");
  1356. _TestRenderer.nonTTY = true;
  1357. _TestRenderer.rendererOptions = {
  1358. subtasks: true,
  1359. state: Object.values(ListrTaskState),
  1360. output: true,
  1361. prompt: true,
  1362. title: true,
  1363. messages: ["skip", "error", "retry", "rollback", "paused"],
  1364. messagesToStderr: ["error", "rollback", "retry"],
  1365. task: [
  1366. "hasRolledBack",
  1367. "isRollingBack",
  1368. "isCompleted",
  1369. "isSkipped",
  1370. "hasFinalized",
  1371. "hasSubtasks",
  1372. "title",
  1373. "hasReset",
  1374. "hasTitle",
  1375. "isPrompt",
  1376. "isPaused",
  1377. "isPending",
  1378. "isSkipped",
  1379. "isStarted",
  1380. "hasFailed",
  1381. "isEnabled",
  1382. "isRetrying",
  1383. "path"
  1384. ]
  1385. };
  1386. var TestRenderer = _TestRenderer;
  1387. // src/renderer/verbose/renderer.ts
  1388. var _VerboseRenderer = class _VerboseRenderer {
  1389. constructor(tasks, options) {
  1390. this.tasks = tasks;
  1391. this.options = options;
  1392. this.cache = {
  1393. rendererOptions: /* @__PURE__ */ new Map(),
  1394. rendererTaskOptions: /* @__PURE__ */ new Map()
  1395. };
  1396. this.options = {
  1397. ..._VerboseRenderer.rendererOptions,
  1398. ...this.options,
  1399. icon: {
  1400. ...LISTR_LOGGER_STYLE.icon,
  1401. ...options?.icon ?? {}
  1402. },
  1403. color: {
  1404. ...LISTR_LOGGER_STYLE.color,
  1405. ...options?.color ?? {}
  1406. }
  1407. };
  1408. this.logger = this.options.logger ?? new ListrLogger({ useIcons: false, toStderr: LISTR_LOGGER_STDERR_LEVELS });
  1409. this.logger.options.icon = this.options.icon;
  1410. this.logger.options.color = this.options.color;
  1411. if (this.options.timestamp) {
  1412. this.logger.options.fields.prefix.unshift(this.options.timestamp);
  1413. }
  1414. }
  1415. render() {
  1416. this.renderer(this.tasks);
  1417. }
  1418. // eslint-disable-next-line @typescript-eslint/no-empty-function
  1419. end() {
  1420. }
  1421. renderer(tasks) {
  1422. tasks.forEach((task) => {
  1423. this.calculate(task);
  1424. task.once("CLOSED" /* CLOSED */, () => {
  1425. this.reset(task);
  1426. });
  1427. const rendererOptions = this.cache.rendererOptions.get(task.id);
  1428. const rendererTaskOptions = this.cache.rendererTaskOptions.get(task.id);
  1429. task.on("SUBTASK" /* SUBTASK */, (subtasks) => {
  1430. this.renderer(subtasks);
  1431. });
  1432. task.on("STATE" /* STATE */, (state) => {
  1433. if (!task.hasTitle()) {
  1434. return;
  1435. }
  1436. if (state === "STARTED" /* STARTED */) {
  1437. this.logger.log("STARTED" /* STARTED */, task.title);
  1438. } else if (state === "COMPLETED" /* COMPLETED */) {
  1439. const timer = rendererTaskOptions.timer;
  1440. this.logger.log(
  1441. "COMPLETED" /* COMPLETED */,
  1442. task.title,
  1443. timer && {
  1444. suffix: {
  1445. ...timer,
  1446. condition: !!task.message?.duration && timer.condition,
  1447. args: [task.message.duration]
  1448. }
  1449. }
  1450. );
  1451. }
  1452. });
  1453. task.on("OUTPUT" /* OUTPUT */, (data) => {
  1454. this.logger.log("OUTPUT" /* OUTPUT */, data);
  1455. });
  1456. task.on("PROMPT" /* PROMPT */, (prompt) => {
  1457. const cleansed = cleanseAnsi(prompt);
  1458. if (cleansed) {
  1459. this.logger.log("PROMPT" /* PROMPT */, cleansed);
  1460. }
  1461. });
  1462. if (this.options?.logTitleChange !== false) {
  1463. task.on("TITLE" /* TITLE */, (title) => {
  1464. this.logger.log("TITLE" /* TITLE */, title);
  1465. });
  1466. }
  1467. task.on("MESSAGE" /* MESSAGE */, (message) => {
  1468. if (message?.error) {
  1469. this.logger.log("FAILED" /* FAILED */, message.error);
  1470. } else if (message?.skip) {
  1471. this.logger.log("SKIPPED" /* SKIPPED */, message.skip);
  1472. } else if (message?.rollback) {
  1473. this.logger.log("ROLLBACK" /* ROLLBACK */, message.rollback);
  1474. } else if (message?.retry) {
  1475. this.logger.log("RETRY" /* RETRY */, task.title, { suffix: message.retry.count.toString() });
  1476. } else if (message?.paused) {
  1477. const timer = rendererOptions?.pausedTimer;
  1478. this.logger.log(
  1479. "PAUSED" /* PAUSED */,
  1480. task.title,
  1481. timer && {
  1482. suffix: {
  1483. ...timer,
  1484. condition: !!message?.paused && timer.condition,
  1485. args: [message.paused - Date.now()]
  1486. }
  1487. }
  1488. );
  1489. }
  1490. });
  1491. });
  1492. }
  1493. calculate(task) {
  1494. if (this.cache.rendererOptions.has(task.id) && this.cache.rendererTaskOptions.has(task.id)) {
  1495. return;
  1496. }
  1497. const rendererOptions = {
  1498. ...this.options,
  1499. ...task.rendererOptions
  1500. };
  1501. this.cache.rendererOptions.set(task.id, rendererOptions);
  1502. this.cache.rendererTaskOptions.set(task.id, {
  1503. ..._VerboseRenderer.rendererTaskOptions,
  1504. timer: rendererOptions.timer,
  1505. ...task.rendererTaskOptions
  1506. });
  1507. }
  1508. reset(task) {
  1509. this.cache.rendererOptions.delete(task.id);
  1510. this.cache.rendererTaskOptions.delete(task.id);
  1511. }
  1512. };
  1513. __name(_VerboseRenderer, "VerboseRenderer");
  1514. _VerboseRenderer.nonTTY = true;
  1515. _VerboseRenderer.rendererOptions = {
  1516. logTitleChange: false,
  1517. pausedTimer: {
  1518. ...PRESET_TIMER,
  1519. format: () => color.yellowBright
  1520. }
  1521. };
  1522. var VerboseRenderer = _VerboseRenderer;
  1523. // src/utils/ui/renderer.ts
  1524. var RENDERERS = {
  1525. default: DefaultRenderer,
  1526. simple: SimpleRenderer,
  1527. verbose: VerboseRenderer,
  1528. test: TestRenderer,
  1529. silent: SilentRenderer
  1530. };
  1531. function isRendererSupported(renderer) {
  1532. return process.stdout.isTTY === true || renderer.nonTTY === true;
  1533. }
  1534. __name(isRendererSupported, "isRendererSupported");
  1535. function getRendererClass(renderer) {
  1536. if (typeof renderer === "string") {
  1537. return RENDERERS[renderer] ?? RENDERERS.default;
  1538. }
  1539. return typeof renderer === "function" ? renderer : RENDERERS.default;
  1540. }
  1541. __name(getRendererClass, "getRendererClass");
  1542. function getRenderer(options) {
  1543. if (assertFunctionOrSelf(options?.silentRendererCondition)) {
  1544. return { renderer: getRendererClass("silent") };
  1545. }
  1546. const r = { renderer: getRendererClass(options.renderer), options: options.rendererOptions };
  1547. if (!isRendererSupported(r.renderer) || assertFunctionOrSelf(options?.fallbackRendererCondition)) {
  1548. return { renderer: getRendererClass(options.fallbackRenderer), options: options.fallbackRendererOptions };
  1549. }
  1550. return r;
  1551. }
  1552. __name(getRenderer, "getRenderer");
  1553. // src/utils/assert.ts
  1554. function assertFunctionOrSelf(functionOrSelf, ...args) {
  1555. if (typeof functionOrSelf === "function") {
  1556. return functionOrSelf(...args);
  1557. } else {
  1558. return functionOrSelf;
  1559. }
  1560. }
  1561. __name(assertFunctionOrSelf, "assertFunctionOrSelf");
  1562. // src/utils/clone.ts
  1563. var import_rfdc = __toESM(require("rfdc"), 1);
  1564. var clone = (0, import_rfdc.default)({ circles: true });
  1565. function cloneObject(obj) {
  1566. return clone(obj);
  1567. }
  1568. __name(cloneObject, "cloneObject");
  1569. // src/utils/concurrency.ts
  1570. var _Concurrency = class _Concurrency {
  1571. constructor(options) {
  1572. this.concurrency = options.concurrency;
  1573. this.count = 0;
  1574. this.queue = /* @__PURE__ */ new Set();
  1575. }
  1576. add(fn) {
  1577. if (this.count < this.concurrency) {
  1578. return this.run(fn);
  1579. }
  1580. return new Promise((resolve) => {
  1581. const callback = /* @__PURE__ */ __name(() => resolve(this.run(fn)), "callback");
  1582. this.queue.add(callback);
  1583. });
  1584. }
  1585. flush() {
  1586. for (const callback of this.queue) {
  1587. if (this.count >= this.concurrency) {
  1588. break;
  1589. }
  1590. this.queue.delete(callback);
  1591. callback();
  1592. }
  1593. }
  1594. run(fn) {
  1595. this.count++;
  1596. const promise = fn();
  1597. const cleanup = /* @__PURE__ */ __name(() => {
  1598. this.count--;
  1599. this.flush();
  1600. }, "cleanup");
  1601. promise.then(cleanup, () => {
  1602. this.queue.clear();
  1603. });
  1604. return promise;
  1605. }
  1606. };
  1607. __name(_Concurrency, "Concurrency");
  1608. var Concurrency = _Concurrency;
  1609. // src/utils/delay.ts
  1610. function delay(time) {
  1611. return new Promise((resolve) => {
  1612. setTimeout(resolve, time);
  1613. });
  1614. }
  1615. __name(delay, "delay");
  1616. // src/interfaces/listr-error.interface.ts
  1617. var _ListrError = class _ListrError extends Error {
  1618. constructor(error, type, task) {
  1619. super(error.message);
  1620. this.error = error;
  1621. this.type = type;
  1622. this.task = task;
  1623. this.name = "ListrError";
  1624. this.path = task.path;
  1625. if (task?.options.collectErrors === "full") {
  1626. this.task = cloneObject(task);
  1627. this.ctx = cloneObject(task.listr.ctx);
  1628. }
  1629. this.stack = error?.stack;
  1630. }
  1631. };
  1632. __name(_ListrError, "ListrError");
  1633. var ListrError = _ListrError;
  1634. // src/interfaces/listr-renderer-error.interface.ts
  1635. var _ListrRendererError = class _ListrRendererError extends Error {
  1636. };
  1637. __name(_ListrRendererError, "ListrRendererError");
  1638. var ListrRendererError = _ListrRendererError;
  1639. // src/interfaces/prompt-error.interface.ts
  1640. var _PromptError = class _PromptError extends Error {
  1641. };
  1642. __name(_PromptError, "PromptError");
  1643. var PromptError = _PromptError;
  1644. // src/lib/task-wrapper.ts
  1645. var _TaskWrapper = class _TaskWrapper {
  1646. constructor(task, options) {
  1647. this.task = task;
  1648. this.options = options;
  1649. }
  1650. get title() {
  1651. return this.task.title;
  1652. }
  1653. /**
  1654. * Title of the current task.
  1655. *
  1656. * @see {@link https://listr2.kilic.dev/task/title.html}
  1657. */
  1658. set title(title) {
  1659. title = Array.isArray(title) ? title : [title];
  1660. this.task.title$ = splat(title.shift(), ...title);
  1661. }
  1662. get output() {
  1663. return this.task.output;
  1664. }
  1665. /**
  1666. * Send output from the current task to the renderer.
  1667. *
  1668. * @see {@link https://listr2.kilic.dev/task/output.html}
  1669. */
  1670. set output(output) {
  1671. output = Array.isArray(output) ? output : [output];
  1672. this.task.output$ = splat(output.shift(), ...output);
  1673. }
  1674. /** Send an output to the output channel as prompt. */
  1675. set promptOutput(output) {
  1676. this.task.promptOutput$ = output;
  1677. }
  1678. /**
  1679. * Creates a new set of Listr subtasks.
  1680. *
  1681. * @see {@link https://listr2.kilic.dev/task/subtasks.html}
  1682. */
  1683. newListr(task, options) {
  1684. let tasks;
  1685. if (typeof task === "function") {
  1686. tasks = task(this);
  1687. } else {
  1688. tasks = task;
  1689. }
  1690. return new Listr(tasks, options, this.task);
  1691. }
  1692. /**
  1693. * Report an error that has to be collected and handled.
  1694. *
  1695. * @see {@link https://listr2.kilic.dev/task/error-handling.html}
  1696. */
  1697. report(error, type) {
  1698. if (this.task.options.collectErrors !== false) {
  1699. this.task.listr.errors.push(new ListrError(error, type, this.task));
  1700. }
  1701. this.task.message$ = { error: error.message ?? this.task?.title };
  1702. }
  1703. /**
  1704. * Skip the current task.
  1705. *
  1706. * @see {@link https://listr2.kilic.dev/task/skip.html}
  1707. */
  1708. skip(message, ...metadata) {
  1709. this.task.state$ = "SKIPPED" /* SKIPPED */;
  1710. if (message) {
  1711. this.task.message$ = { skip: message ? splat(message, ...metadata) : this.task?.title };
  1712. }
  1713. }
  1714. /**
  1715. * Check whether this task is currently in a retry state.
  1716. *
  1717. * @see {@link https://listr2.kilic.dev/task/retry.html}
  1718. */
  1719. isRetrying() {
  1720. return this.task.isRetrying() ? this.task.retry : { count: 0 };
  1721. }
  1722. /**
  1723. * Create a new prompt for getting user input through `enquirer`.
  1724. *
  1725. * - `enquirer` is a optional peer dependency and has to be already installed separately.
  1726. *
  1727. * @see {@link https://listr2.kilic.dev/task/prompt.html}
  1728. */
  1729. async prompt(options) {
  1730. return createPrompt.bind(this)(options, { ...this.options?.injectWrapper });
  1731. }
  1732. /* istanbul ignore next */
  1733. /**
  1734. * Cancel the current active prompt, if there is any.
  1735. *
  1736. * @see {@link https://listr2.kilic.dev/task/prompt.html}
  1737. */
  1738. cancelPrompt(options) {
  1739. if (!this.task.prompt || this.task.prompt instanceof PromptError) {
  1740. return;
  1741. }
  1742. if (options?.throw) {
  1743. this.task.prompt.cancel();
  1744. } else {
  1745. this.task.prompt.submit();
  1746. }
  1747. }
  1748. /**
  1749. * Generates a fake stdout for your use case, where it will be tunnelled through Listr to handle the rendering process.
  1750. *
  1751. * @see {@link https://listr2.kilic.dev/renderer/process-output.html}
  1752. */
  1753. stdout(type) {
  1754. return createWritable((chunk) => {
  1755. switch (type) {
  1756. case "PROMPT" /* PROMPT */:
  1757. this.promptOutput = chunk.toString();
  1758. break;
  1759. default:
  1760. this.output = chunk.toString();
  1761. }
  1762. });
  1763. }
  1764. /** Run this task. */
  1765. run(ctx) {
  1766. return this.task.run(ctx, this);
  1767. }
  1768. };
  1769. __name(_TaskWrapper, "TaskWrapper");
  1770. var TaskWrapper = _TaskWrapper;
  1771. // src/lib/task.ts
  1772. var import_crypto = require("crypto");
  1773. var import_stream2 = require("stream");
  1774. // src/lib/listr-task-event-manager.ts
  1775. var _ListrTaskEventManager = class _ListrTaskEventManager extends EventManager {
  1776. };
  1777. __name(_ListrTaskEventManager, "ListrTaskEventManager");
  1778. var ListrTaskEventManager = _ListrTaskEventManager;
  1779. // src/lib/task.ts
  1780. var _Task = class _Task extends ListrTaskEventManager {
  1781. constructor(listr, task, options, rendererOptions) {
  1782. super();
  1783. this.listr = listr;
  1784. this.task = task;
  1785. this.options = options;
  1786. this.rendererOptions = rendererOptions;
  1787. /** Unique id per task, can be used for identifying a Task. */
  1788. this.id = (0, import_crypto.randomUUID)();
  1789. /** The current state of the task. */
  1790. this.state = "WAITING" /* WAITING */;
  1791. /**
  1792. * A channel for messages.
  1793. *
  1794. * This requires a separate channel for messages like error, skip or runtime messages to further utilize in the renderers.
  1795. */
  1796. this.message = {};
  1797. if (task.title) {
  1798. const title = Array.isArray(task?.title) ? task.title : [task.title];
  1799. this.title = splat(title.shift(), ...title);
  1800. this.initialTitle = this.title;
  1801. }
  1802. this.taskFn = task.task;
  1803. this.parent = listr.parentTask;
  1804. this.rendererTaskOptions = task.options;
  1805. }
  1806. /**
  1807. * Update the current state of the Task and emit the neccassary events.
  1808. */
  1809. set state$(state) {
  1810. this.state = state;
  1811. this.emit("STATE" /* STATE */, state);
  1812. if (this.hasSubtasks() && this.hasFailed()) {
  1813. for (const subtask of this.subtasks) {
  1814. if (subtask.state === "STARTED" /* STARTED */) {
  1815. subtask.state$ = "FAILED" /* FAILED */;
  1816. }
  1817. }
  1818. }
  1819. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1820. }
  1821. /**
  1822. * Update the current output of the Task and emit the neccassary events.
  1823. */
  1824. set output$(data) {
  1825. this.output = data;
  1826. this.emit("OUTPUT" /* OUTPUT */, data);
  1827. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1828. }
  1829. /**
  1830. * Update the current prompt output of the Task and emit the neccassary events.
  1831. */
  1832. set promptOutput$(data) {
  1833. this.emit("PROMPT" /* PROMPT */, data);
  1834. if (cleanseAnsi(data)) {
  1835. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1836. }
  1837. }
  1838. /**
  1839. * Update or extend the current message of the Task and emit the neccassary events.
  1840. */
  1841. set message$(data) {
  1842. this.message = { ...this.message, ...data };
  1843. this.emit("MESSAGE" /* MESSAGE */, data);
  1844. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1845. }
  1846. /**
  1847. * Update the current title of the Task and emit the neccassary events.
  1848. */
  1849. set title$(title) {
  1850. this.title = title;
  1851. this.emit("TITLE" /* TITLE */, title);
  1852. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1853. }
  1854. /**
  1855. * Current task path in the hierarchy.
  1856. */
  1857. get path() {
  1858. return [...this.listr.path, this.initialTitle];
  1859. }
  1860. /**
  1861. * Checks whether the current task with the given context should be set as enabled.
  1862. */
  1863. async check(ctx) {
  1864. if (this.state === "WAITING" /* WAITING */) {
  1865. this.enabled = await assertFunctionOrSelf(this.task?.enabled ?? true, ctx);
  1866. this.emit("ENABLED" /* ENABLED */, this.enabled);
  1867. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  1868. }
  1869. return this.enabled;
  1870. }
  1871. /** Returns whether this task has subtasks. */
  1872. hasSubtasks() {
  1873. return this.subtasks?.length > 0;
  1874. }
  1875. /** Returns whether this task is finalized in someform. */
  1876. hasFinalized() {
  1877. return this.isCompleted() || this.hasFailed() || this.isSkipped() || this.hasRolledBack();
  1878. }
  1879. /** Returns whether this task is in progress. */
  1880. isPending() {
  1881. return this.isStarted() || this.isPrompt() || this.hasReset();
  1882. }
  1883. /** Returns whether this task has started. */
  1884. isStarted() {
  1885. return this.state === "STARTED" /* STARTED */;
  1886. }
  1887. /** Returns whether this task is skipped. */
  1888. isSkipped() {
  1889. return this.state === "SKIPPED" /* SKIPPED */;
  1890. }
  1891. /** Returns whether this task has been completed. */
  1892. isCompleted() {
  1893. return this.state === "COMPLETED" /* COMPLETED */;
  1894. }
  1895. /** Returns whether this task has been failed. */
  1896. hasFailed() {
  1897. return this.state === "FAILED" /* FAILED */;
  1898. }
  1899. /** Returns whether this task has an active rollback task going on. */
  1900. isRollingBack() {
  1901. return this.state === "ROLLING_BACK" /* ROLLING_BACK */;
  1902. }
  1903. /** Returns whether the rollback action was successful. */
  1904. hasRolledBack() {
  1905. return this.state === "ROLLED_BACK" /* ROLLED_BACK */;
  1906. }
  1907. /** Returns whether this task has an actively retrying task going on. */
  1908. isRetrying() {
  1909. return this.state === "RETRY" /* RETRY */;
  1910. }
  1911. /** Returns whether this task has some kind of reset like retry and rollback going on. */
  1912. hasReset() {
  1913. return this.state === "RETRY" /* RETRY */ || this.state === "ROLLING_BACK" /* ROLLING_BACK */;
  1914. }
  1915. /** Returns whether enabled function resolves to true. */
  1916. isEnabled() {
  1917. return this.enabled;
  1918. }
  1919. /** Returns whether this task actually has a title. */
  1920. hasTitle() {
  1921. return typeof this?.title === "string";
  1922. }
  1923. /** Returns whether this task has a prompt inside. */
  1924. isPrompt() {
  1925. return this.state === "PROMPT" /* PROMPT */ || this.state === "PROMPT_COMPLETED" /* PROMPT_COMPLETED */;
  1926. }
  1927. /** Returns whether this task is currently paused. */
  1928. isPaused() {
  1929. return this.state === "PAUSED" /* PAUSED */;
  1930. }
  1931. /** Returns whether this task is closed. */
  1932. isClosed() {
  1933. return this.closed;
  1934. }
  1935. /** Pause the given task for certain time. */
  1936. async pause(time) {
  1937. const state = this.state;
  1938. this.state$ = "PAUSED" /* PAUSED */;
  1939. this.message$ = {
  1940. paused: Date.now() + time
  1941. };
  1942. await delay(time);
  1943. this.state$ = state;
  1944. this.message$ = {
  1945. paused: null
  1946. };
  1947. }
  1948. /** Run the current task. */
  1949. async run(context, wrapper) {
  1950. const handleResult = /* @__PURE__ */ __name((result) => {
  1951. if (result instanceof Listr) {
  1952. result.options = { ...this.options, ...result.options };
  1953. result.rendererClass = getRendererClass("silent");
  1954. this.subtasks = result.tasks;
  1955. result.errors = this.listr.errors;
  1956. this.emit("SUBTASK" /* SUBTASK */, this.subtasks);
  1957. result = result.run(context);
  1958. } else if (result instanceof Promise) {
  1959. result = result.then(handleResult);
  1960. } else if (result instanceof import_stream2.Readable) {
  1961. result = new Promise((resolve, reject) => {
  1962. result.on("data", (data) => {
  1963. this.output$ = data.toString();
  1964. });
  1965. result.on("error", (error) => reject(error));
  1966. result.on("end", () => resolve(null));
  1967. });
  1968. } else if (isObservable(result)) {
  1969. result = new Promise((resolve, reject) => {
  1970. result.subscribe({
  1971. next: (data) => {
  1972. this.output$ = data;
  1973. },
  1974. error: reject,
  1975. complete: resolve
  1976. });
  1977. });
  1978. }
  1979. return result;
  1980. }, "handleResult");
  1981. const startTime = Date.now();
  1982. this.state$ = "STARTED" /* STARTED */;
  1983. const skipped = await assertFunctionOrSelf(this.task?.skip ?? false, context);
  1984. if (skipped) {
  1985. if (typeof skipped === "string") {
  1986. this.message$ = { skip: skipped };
  1987. } else if (this.hasTitle()) {
  1988. this.message$ = { skip: this.title };
  1989. } else {
  1990. this.message$ = { skip: "Skipped task without a title." };
  1991. }
  1992. this.state$ = "SKIPPED" /* SKIPPED */;
  1993. return;
  1994. }
  1995. try {
  1996. const retryCount = typeof this.task?.retry === "number" && this.task.retry > 0 ? this.task.retry + 1 : typeof this.task?.retry === "object" && this.task.retry.tries > 0 ? this.task.retry.tries + 1 : 1;
  1997. const retryDelay = typeof this.task.retry === "object" && this.task.retry.delay;
  1998. for (let retries = 1; retries <= retryCount; retries++) {
  1999. try {
  2000. await handleResult(this.taskFn(context, wrapper));
  2001. break;
  2002. } catch (err) {
  2003. if (retries !== retryCount) {
  2004. this.retry = { count: retries, error: err };
  2005. this.message$ = { retry: this.retry };
  2006. this.title$ = this.initialTitle;
  2007. this.output = void 0;
  2008. wrapper.report(err, "WILL_RETRY" /* WILL_RETRY */);
  2009. this.state$ = "RETRY" /* RETRY */;
  2010. if (retryDelay) {
  2011. await this.pause(retryDelay);
  2012. }
  2013. } else {
  2014. throw err;
  2015. }
  2016. }
  2017. }
  2018. if (this.isStarted() || this.isRetrying()) {
  2019. this.message$ = { duration: Date.now() - startTime };
  2020. this.state$ = "COMPLETED" /* COMPLETED */;
  2021. }
  2022. } catch (error) {
  2023. if (this.prompt instanceof PromptError) {
  2024. error = this.prompt;
  2025. }
  2026. if (this.task?.rollback) {
  2027. wrapper.report(error, "WILL_ROLLBACK" /* WILL_ROLLBACK */);
  2028. try {
  2029. this.state$ = "ROLLING_BACK" /* ROLLING_BACK */;
  2030. await this.task.rollback(context, wrapper);
  2031. this.message$ = { rollback: this.title };
  2032. this.state$ = "ROLLED_BACK" /* ROLLED_BACK */;
  2033. } catch (err) {
  2034. this.state$ = "FAILED" /* FAILED */;
  2035. wrapper.report(err, "HAS_FAILED_TO_ROLLBACK" /* HAS_FAILED_TO_ROLLBACK */);
  2036. this.close();
  2037. throw err;
  2038. }
  2039. if (this.listr.options?.exitAfterRollback !== false) {
  2040. this.close();
  2041. throw error;
  2042. }
  2043. } else {
  2044. this.state$ = "FAILED" /* FAILED */;
  2045. if (this.listr.options.exitOnError !== false && await assertFunctionOrSelf(this.task?.exitOnError, context) !== false) {
  2046. wrapper.report(error, "HAS_FAILED" /* HAS_FAILED */);
  2047. this.close();
  2048. throw error;
  2049. } else if (!this.hasSubtasks()) {
  2050. wrapper.report(error, "HAS_FAILED_WITHOUT_ERROR" /* HAS_FAILED_WITHOUT_ERROR */);
  2051. }
  2052. }
  2053. } finally {
  2054. this.close();
  2055. }
  2056. }
  2057. close() {
  2058. this.emit("CLOSED" /* CLOSED */);
  2059. this.listr.events.emit("SHOUD_REFRESH_RENDER" /* SHOULD_REFRESH_RENDER */);
  2060. this.complete();
  2061. }
  2062. };
  2063. __name(_Task, "Task");
  2064. var Task = _Task;
  2065. // src/lib/listr-event-manager.ts
  2066. var _ListrEventManager = class _ListrEventManager extends EventManager {
  2067. };
  2068. __name(_ListrEventManager, "ListrEventManager");
  2069. var ListrEventManager = _ListrEventManager;
  2070. // src/listr.ts
  2071. var _Listr = class _Listr {
  2072. constructor(task, options, parentTask) {
  2073. this.task = task;
  2074. this.options = options;
  2075. this.parentTask = parentTask;
  2076. this.tasks = [];
  2077. this.errors = [];
  2078. this.path = [];
  2079. this.options = {
  2080. concurrent: false,
  2081. renderer: "default",
  2082. fallbackRenderer: "simple",
  2083. exitOnError: true,
  2084. exitAfterRollback: true,
  2085. collectErrors: false,
  2086. registerSignalListeners: true,
  2087. ...this.parentTask?.options ?? {},
  2088. ...options
  2089. };
  2090. if (this.options.concurrent === true) {
  2091. this.options.concurrent = Infinity;
  2092. } else if (typeof this.options.concurrent !== "number") {
  2093. this.options.concurrent = 1;
  2094. }
  2095. this.concurrency = new Concurrency({ concurrency: this.options.concurrent });
  2096. if (parentTask) {
  2097. this.path = [...parentTask.listr.path, parentTask.title];
  2098. this.errors = parentTask.listr.errors;
  2099. }
  2100. if (this.parentTask?.listr.events instanceof ListrEventManager) {
  2101. this.events = this.parentTask.listr.events;
  2102. } else {
  2103. this.events = new ListrEventManager();
  2104. }
  2105. const renderer = getRenderer({
  2106. renderer: this.options.renderer,
  2107. rendererOptions: this.options.rendererOptions,
  2108. fallbackRenderer: this.options.fallbackRenderer,
  2109. fallbackRendererOptions: this.options.fallbackRendererOptions,
  2110. fallbackRendererCondition: this.options?.fallbackRendererCondition,
  2111. silentRendererCondition: this.options?.silentRendererCondition
  2112. });
  2113. this.rendererClass = renderer.renderer;
  2114. this.rendererClassOptions = renderer.options;
  2115. this.add(task ?? []);
  2116. if (this.options.registerSignalListeners) {
  2117. process.once("SIGINT", () => {
  2118. this.tasks.forEach(async (task2) => {
  2119. if (task2.isPending()) {
  2120. task2.state$ = "FAILED" /* FAILED */;
  2121. }
  2122. });
  2123. this.renderer.end(new Error("Interrupted."));
  2124. process.exit(127);
  2125. }).setMaxListeners(0);
  2126. }
  2127. if (this.options?.disableColor) {
  2128. process.env["LISTR_DISABLE_COLOR" /* DISABLE_COLOR */] = "1";
  2129. } else if (this.options?.forceColor) {
  2130. process.env["FORCE_COLOR" /* FORCE_COLOR */] = "1";
  2131. }
  2132. if (this.options?.forceTTY) {
  2133. process.stdout.isTTY = true;
  2134. process.stderr.isTTY = true;
  2135. }
  2136. if (this.options?.forceUnicode) {
  2137. process.env["LISTR_FORCE_UNICODE" /* FORCE_UNICODE */] = "1";
  2138. }
  2139. }
  2140. add(tasks) {
  2141. this.tasks.push(...this.generate(tasks));
  2142. }
  2143. async run(context) {
  2144. if (!this.renderer) {
  2145. this.renderer = new this.rendererClass(this.tasks, this.rendererClassOptions, this.events);
  2146. }
  2147. await this.renderer.render();
  2148. this.ctx = this.options?.ctx ?? context ?? {};
  2149. await Promise.all(this.tasks.map((task) => task.check(this.ctx)));
  2150. try {
  2151. await Promise.all(this.tasks.map((task) => this.concurrency.add(() => this.runTask(task))));
  2152. this.renderer.end();
  2153. } catch (err) {
  2154. if (this.options.exitOnError !== false) {
  2155. this.renderer.end(err);
  2156. throw err;
  2157. }
  2158. }
  2159. return this.ctx;
  2160. }
  2161. generate(tasks) {
  2162. tasks = Array.isArray(tasks) ? tasks : [tasks];
  2163. return tasks.map((task) => new Task(this, task, this.options, { ...this.rendererClassOptions }));
  2164. }
  2165. async runTask(task) {
  2166. if (!await task.check(this.ctx)) {
  2167. return;
  2168. }
  2169. return new TaskWrapper(task, this.options).run(this.ctx);
  2170. }
  2171. };
  2172. __name(_Listr, "Listr");
  2173. var Listr = _Listr;
  2174. // src/manager.ts
  2175. var _Manager = class _Manager {
  2176. constructor(options) {
  2177. this.options = options;
  2178. this.errors = [];
  2179. this.tasks = [];
  2180. }
  2181. get ctx() {
  2182. return this.options.ctx;
  2183. }
  2184. set ctx(ctx) {
  2185. this.options.ctx = ctx;
  2186. }
  2187. add(tasks, options) {
  2188. options = { ...this.options, ...options };
  2189. this.tasks = [...this.tasks, this.indent(tasks, options)];
  2190. }
  2191. async runAll(options) {
  2192. options = { ...this.options, ...options };
  2193. const tasks = [...this.tasks];
  2194. this.tasks = [];
  2195. const ctx = await this.run(tasks, options);
  2196. return ctx;
  2197. }
  2198. newListr(tasks, options) {
  2199. return new Listr(tasks, options);
  2200. }
  2201. indent(tasks, options, taskOptions) {
  2202. options = { ...this.options, ...options };
  2203. if (typeof tasks === "function") {
  2204. return {
  2205. ...taskOptions,
  2206. task: (ctx) => this.newListr(tasks(ctx), options)
  2207. };
  2208. }
  2209. return {
  2210. ...taskOptions,
  2211. task: () => this.newListr(tasks, options)
  2212. };
  2213. }
  2214. async run(tasks, options) {
  2215. options = { ...this.options, ...options };
  2216. const task = this.newListr(tasks, options);
  2217. const ctx = await task.run();
  2218. this.errors.push(...task.errors);
  2219. return ctx;
  2220. }
  2221. };
  2222. __name(_Manager, "Manager");
  2223. var Manager = _Manager;
  2224. // Annotate the CommonJS export names for ESM import in node:
  2225. 0 && (module.exports = {
  2226. ANSI_ESCAPE,
  2227. ANSI_ESCAPE_CODES,
  2228. BaseEventMap,
  2229. Concurrency,
  2230. DefaultRenderer,
  2231. EventManager,
  2232. LISTR_DEFAULT_RENDERER_STYLE,
  2233. LISTR_LOGGER_STDERR_LEVELS,
  2234. LISTR_LOGGER_STYLE,
  2235. Listr,
  2236. ListrDefaultRendererLogLevels,
  2237. ListrEnvironmentVariables,
  2238. ListrError,
  2239. ListrErrorTypes,
  2240. ListrEventManager,
  2241. ListrEventType,
  2242. ListrLogLevels,
  2243. ListrLogger,
  2244. ListrRendererError,
  2245. ListrTaskEventManager,
  2246. ListrTaskEventType,
  2247. ListrTaskState,
  2248. Manager,
  2249. PRESET_TIMER,
  2250. PRESET_TIMESTAMP,
  2251. ProcessOutput,
  2252. ProcessOutputBuffer,
  2253. ProcessOutputStream,
  2254. PromptError,
  2255. SilentRenderer,
  2256. SimpleRenderer,
  2257. Spinner,
  2258. TestRenderer,
  2259. TestRendererSerializer,
  2260. VerboseRenderer,
  2261. assertFunctionOrSelf,
  2262. cleanseAnsi,
  2263. cloneObject,
  2264. color,
  2265. createPrompt,
  2266. createWritable,
  2267. delay,
  2268. figures,
  2269. getRenderer,
  2270. getRendererClass,
  2271. indent,
  2272. isObservable,
  2273. isUnicodeSupported,
  2274. parseTimer,
  2275. parseTimestamp,
  2276. splat
  2277. });