版博士V2.0程序
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

1300 lignes
43 KiB

  1. // src/listr.ts
  2. import pMap from "p-map";
  3. import { Subject as Subject2 } from "rxjs";
  4. // src/constants/state.constants.ts
  5. var ListrTaskState = /* @__PURE__ */ ((ListrTaskState2) => {
  6. ListrTaskState2["PENDING"] = "PENDING";
  7. ListrTaskState2["COMPLETED"] = "COMPLETED";
  8. ListrTaskState2["FAILED"] = "FAILED";
  9. ListrTaskState2["SKIPPED"] = "SKIPPED";
  10. ListrTaskState2["ROLLING_BACK"] = "ROLLING_BACK";
  11. ListrTaskState2["ROLLED_BACK"] = "ROLLED_BACK";
  12. ListrTaskState2["RETRY"] = "RETRY";
  13. return ListrTaskState2;
  14. })(ListrTaskState || {});
  15. // src/lib/task.ts
  16. import { isObservable, Subject } from "rxjs";
  17. import { Readable } from "stream";
  18. // src/constants/event.constants.ts
  19. var ListrEventType = /* @__PURE__ */ ((ListrEventType2) => {
  20. ListrEventType2["TITLE"] = "TITLE";
  21. ListrEventType2["STATE"] = "STATE";
  22. ListrEventType2["ENABLED"] = "ENABLED";
  23. ListrEventType2["SUBTASK"] = "SUBTASK";
  24. ListrEventType2["DATA"] = "DATA";
  25. ListrEventType2["MESSAGE"] = "MESSAGE";
  26. return ListrEventType2;
  27. })(ListrEventType || {});
  28. // src/utils/general.ts
  29. import rfdc from "rfdc";
  30. var clone = rfdc({ circles: true });
  31. function cloneObject(obj) {
  32. return clone(obj);
  33. }
  34. // src/interfaces/listr-error.interface.ts
  35. var ListrError = class extends Error {
  36. constructor(error, type, task) {
  37. super(error.message);
  38. this.error = error;
  39. this.type = type;
  40. this.task = task;
  41. this.name = "ListrError";
  42. this.path = [...task.listr.path ?? [], task.title].join(" > ");
  43. if ((task == null ? void 0 : task.options.collectErrors) === "full") {
  44. this.task = cloneObject(task);
  45. this.ctx = cloneObject(task.listr.ctx);
  46. }
  47. this.stack = error == null ? void 0 : error.stack;
  48. }
  49. };
  50. var ListrErrorTypes = /* @__PURE__ */ ((ListrErrorTypes2) => {
  51. ListrErrorTypes2["WILL_RETRY"] = "WILL_RETRY";
  52. ListrErrorTypes2["WILL_ROLLBACK"] = "WILL_ROLLBACK";
  53. ListrErrorTypes2["HAS_FAILED_TO_ROLLBACK"] = "HAS_FAILED_TO_ROLLBACK";
  54. ListrErrorTypes2["HAS_FAILED"] = "HAS_FAILED";
  55. ListrErrorTypes2["HAS_FAILED_WITHOUT_ERROR"] = "HAS_FAILED_WITHOUT_ERROR";
  56. return ListrErrorTypes2;
  57. })(ListrErrorTypes || {});
  58. var PromptError = class extends Error {
  59. constructor(message) {
  60. super(message);
  61. this.name = "PromptError";
  62. }
  63. };
  64. // src/utils/assert.ts
  65. function assertFunctionOrSelf(functionOrSelf, ...args) {
  66. if (typeof functionOrSelf === "function") {
  67. return functionOrSelf(...args);
  68. } else {
  69. return functionOrSelf;
  70. }
  71. }
  72. // src/renderer/default.renderer.ts
  73. import cliTruncate from "cli-truncate";
  74. import logUpdate from "log-update";
  75. import { EOL } from "os";
  76. import cliWrap from "wrap-ansi";
  77. // src/utils/colorette.ts
  78. import { createColors } from "colorette";
  79. var _a;
  80. var colorette_default = createColors({ useColor: ((_a = process.env) == null ? void 0 : _a.LISTR_DISABLE_COLOR) !== "1" });
  81. // src/utils/is-unicode-supported.ts
  82. function isUnicodeSupported() {
  83. if (process.platform !== "win32") {
  84. return true;
  85. }
  86. return Boolean(process.env.CI) || Boolean(process.env.WT_SESSION) || process.env.TERM_PROGRAM === "vscode" || process.env.TERM === "xterm-256color" || process.env.TERM === "alacritty";
  87. }
  88. // src/utils/figures.ts
  89. var FIGURES_MAIN = {
  90. warning: "\u26A0",
  91. cross: "\u2716",
  92. arrowDown: "\u2193",
  93. tick: "\u2714",
  94. arrowRight: "\u2192",
  95. pointer: "\u276F",
  96. checkboxOn: "\u2612",
  97. arrowLeft: "\u2190",
  98. squareSmallFilled: "\u25FC",
  99. pointerSmall: "\u203A"
  100. };
  101. var FIGURES_FALLBACK = {
  102. ...FIGURES_MAIN,
  103. warning: "\u203C",
  104. cross: "\xD7",
  105. tick: "\u221A",
  106. pointer: ">",
  107. checkboxOn: "[\xD7]",
  108. squareSmallFilled: "\u25A0"
  109. };
  110. var figures = isUnicodeSupported() ? FIGURES_MAIN : FIGURES_FALLBACK;
  111. // src/utils/indent-string.ts
  112. function indentString(string, count) {
  113. return string.replace(/^(?!\s*$)/gm, " ".repeat(count));
  114. }
  115. // src/utils/parse-time.ts
  116. function parseTaskTime(duration) {
  117. const seconds = Math.floor(duration / 1e3);
  118. const minutes = Math.floor(seconds / 60);
  119. let parsedTime;
  120. if (seconds === 0 && minutes === 0) {
  121. parsedTime = `0.${Math.floor(duration / 100)}s`;
  122. }
  123. if (seconds > 0) {
  124. parsedTime = `${seconds % 60}s`;
  125. }
  126. if (minutes > 0) {
  127. parsedTime = `${minutes}m${parsedTime}`;
  128. }
  129. return parsedTime;
  130. }
  131. // src/renderer/default.renderer.ts
  132. var _DefaultRenderer = class {
  133. constructor(tasks, options, renderHook$) {
  134. this.tasks = tasks;
  135. this.options = options;
  136. this.renderHook$ = renderHook$;
  137. this.bottomBar = {};
  138. this.spinner = !isUnicodeSupported() ? ["-", "\\", "|", "/"] : ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
  139. this.spinnerPosition = 0;
  140. this.options = { ..._DefaultRenderer.rendererOptions, ...this.options };
  141. }
  142. getTaskOptions(task) {
  143. return { ..._DefaultRenderer.rendererTaskOptions, ...task.rendererTaskOptions };
  144. }
  145. isBottomBar(task) {
  146. const bottomBar = this.getTaskOptions(task).bottomBar;
  147. return typeof bottomBar === "number" && bottomBar !== 0 || typeof bottomBar === "boolean" && bottomBar !== false;
  148. }
  149. hasPersistentOutput(task) {
  150. return this.getTaskOptions(task).persistentOutput === true;
  151. }
  152. hasTimer(task) {
  153. return this.getTaskOptions(task).showTimer === true;
  154. }
  155. getSelfOrParentOption(task, key) {
  156. var _a2, _b;
  157. return ((_a2 = task == null ? void 0 : task.rendererOptions) == null ? void 0 : _a2[key]) ?? ((_b = this.options) == null ? void 0 : _b[key]);
  158. }
  159. getTaskTime(task) {
  160. return colorette_default.dim(`[${parseTaskTime(task.message.duration)}]`);
  161. }
  162. createRender(options) {
  163. options = {
  164. ...{
  165. tasks: true,
  166. bottomBar: true,
  167. prompt: true
  168. },
  169. ...options
  170. };
  171. const render = [];
  172. const renderTasks = this.multiLineRenderer(this.tasks);
  173. const renderBottomBar = this.renderBottomBar();
  174. const renderPrompt = this.renderPrompt();
  175. if (options.tasks && (renderTasks == null ? void 0 : renderTasks.trim().length) > 0) {
  176. render.push(renderTasks);
  177. }
  178. if (options.bottomBar && (renderBottomBar == null ? void 0 : renderBottomBar.trim().length) > 0) {
  179. render.push((render.length > 0 ? EOL : "") + renderBottomBar);
  180. }
  181. if (options.prompt && (renderPrompt == null ? void 0 : renderPrompt.trim().length) > 0) {
  182. render.push((render.length > 0 ? EOL : "") + renderPrompt);
  183. }
  184. return render.length > 0 ? render.join(EOL) : "";
  185. }
  186. render() {
  187. var _a2;
  188. if (this.id) {
  189. return;
  190. }
  191. const updateRender = () => logUpdate(this.createRender());
  192. if (!((_a2 = this.options) == null ? void 0 : _a2.lazy)) {
  193. this.id = setInterval(() => {
  194. this.spinnerPosition = ++this.spinnerPosition % this.spinner.length;
  195. updateRender();
  196. }, 100);
  197. }
  198. this.renderHook$.subscribe(() => {
  199. updateRender();
  200. });
  201. }
  202. end() {
  203. clearInterval(this.id);
  204. if (this.id) {
  205. this.id = void 0;
  206. }
  207. logUpdate.clear();
  208. logUpdate.done();
  209. if (!this.options.clearOutput) {
  210. process.stdout.write(this.createRender({ prompt: false }) + EOL);
  211. }
  212. }
  213. multiLineRenderer(tasks, level = 0) {
  214. var _a2, _b;
  215. let output = [];
  216. for (const task of tasks) {
  217. if (task.isEnabled()) {
  218. if (task.hasTitle()) {
  219. if (!(tasks.some((task2) => task2.hasFailed()) && !task.hasFailed() && task.options.exitOnError !== false && !(task.isCompleted() || task.isSkipped()))) {
  220. if (task.hasFailed() && this.getSelfOrParentOption(task, "collapseErrors")) {
  221. output = [
  222. ...output,
  223. this.formatString(
  224. !task.hasSubtasks() && task.message.error && this.getSelfOrParentOption(task, "showErrorMessage") ? task.message.error : task.title,
  225. this.getSymbol(task),
  226. level
  227. )
  228. ];
  229. } else if (task.isSkipped() && this.getSelfOrParentOption(task, "collapseSkips")) {
  230. output = [
  231. ...output,
  232. this.formatString(
  233. this.addSuffixToMessage(
  234. task.message.skip && this.getSelfOrParentOption(task, "showSkipMessage") ? task.message.skip : task.title,
  235. "SKIPPED",
  236. this.getSelfOrParentOption(task, "suffixSkips")
  237. ),
  238. this.getSymbol(task),
  239. level
  240. )
  241. ];
  242. } else if (task.isRetrying() && this.getSelfOrParentOption(task, "suffixRetries")) {
  243. output = [...output, this.formatString(this.addSuffixToMessage(task.title, `RETRYING-${task.message.retry.count}`), this.getSymbol(task), level)];
  244. } else if (task.isCompleted() && task.hasTitle() && (this.getSelfOrParentOption(task, "showTimer") || this.hasTimer(task))) {
  245. output = [...output, this.formatString(`${task == null ? void 0 : task.title} ${this.getTaskTime(task)}`, this.getSymbol(task), level)];
  246. } else {
  247. output = [...output, this.formatString(task.title, this.getSymbol(task), level)];
  248. }
  249. } else {
  250. output = [...output, this.formatString(task.title, colorette_default.red(figures.squareSmallFilled), level)];
  251. }
  252. }
  253. if (!task.hasSubtasks() || !this.getSelfOrParentOption(task, "showSubtasks")) {
  254. if (task.hasFailed() && this.getSelfOrParentOption(task, "collapseErrors") === false && (this.getSelfOrParentOption(task, "showErrorMessage") || !this.getSelfOrParentOption(task, "showSubtasks"))) {
  255. output = [...output, this.dumpData(task, level, "error")];
  256. } else if (task.isSkipped() && this.getSelfOrParentOption(task, "collapseSkips") === false && (this.getSelfOrParentOption(task, "showSkipMessage") || !this.getSelfOrParentOption(task, "showSubtasks"))) {
  257. output = [...output, this.dumpData(task, level, "skip")];
  258. }
  259. }
  260. if (task == null ? void 0 : task.output) {
  261. if ((task.isPending() || task.isRetrying() || task.isRollingBack()) && task.isPrompt()) {
  262. this.promptBar = task.output;
  263. } else if (this.isBottomBar(task) || !task.hasTitle()) {
  264. const data = [this.dumpData(task, -1)];
  265. if (!this.bottomBar[task.id]) {
  266. this.bottomBar[task.id] = {};
  267. this.bottomBar[task.id].data = [];
  268. const bottomBar = this.getTaskOptions(task).bottomBar;
  269. if (typeof bottomBar === "boolean") {
  270. this.bottomBar[task.id].items = 1;
  271. } else {
  272. this.bottomBar[task.id].items = bottomBar;
  273. }
  274. }
  275. if (!((_b = (_a2 = this.bottomBar[task.id]) == null ? void 0 : _a2.data) == null ? void 0 : _b.some((element) => data.includes(element))) && !task.isSkipped()) {
  276. this.bottomBar[task.id].data = [...this.bottomBar[task.id].data, ...data];
  277. }
  278. } else if (task.isPending() || task.isRetrying() || task.isRollingBack() || this.hasPersistentOutput(task)) {
  279. output = [...output, this.dumpData(task, level)];
  280. }
  281. }
  282. if (this.getSelfOrParentOption(task, "showSubtasks") !== false && task.hasSubtasks() && (task.isPending() || task.hasFailed() || task.isCompleted() && !task.hasTitle() || task.isCompleted() && this.getSelfOrParentOption(task, "collapse") === false && !task.subtasks.some((subtask) => subtask.rendererOptions.collapse === true) || task.subtasks.some((subtask) => subtask.rendererOptions.collapse === false) || task.subtasks.some((subtask) => subtask.hasFailed()) || task.subtasks.some((subtask) => subtask.hasRolledBack()))) {
  283. const subtaskLevel = !task.hasTitle() ? level : level + 1;
  284. const subtaskRender = this.multiLineRenderer(task.subtasks, subtaskLevel);
  285. if ((subtaskRender == null ? void 0 : subtaskRender.trim()) !== "") {
  286. output = [...output, subtaskRender];
  287. }
  288. }
  289. if (task.isCompleted() || task.hasFailed() || task.isSkipped() || task.hasRolledBack()) {
  290. this.promptBar = null;
  291. if (!this.hasPersistentOutput(task)) {
  292. delete this.bottomBar[task.id];
  293. }
  294. }
  295. }
  296. }
  297. output = output.filter(Boolean);
  298. if (output.length > 0) {
  299. return output.join(EOL);
  300. } else {
  301. return;
  302. }
  303. }
  304. renderBottomBar() {
  305. if (Object.keys(this.bottomBar).length > 0) {
  306. this.bottomBar = Object.keys(this.bottomBar).reduce((o, key) => {
  307. if (!(o == null ? void 0 : o[key])) {
  308. o[key] = {};
  309. }
  310. o[key] = this.bottomBar[key];
  311. this.bottomBar[key].data = this.bottomBar[key].data.slice(-this.bottomBar[key].items);
  312. o[key].data = this.bottomBar[key].data;
  313. return o;
  314. }, {});
  315. return Object.values(this.bottomBar).reduce((o, value) => o = [...o, ...value.data], []).filter(Boolean).join(EOL);
  316. }
  317. }
  318. renderPrompt() {
  319. if (this.promptBar) {
  320. return this.promptBar;
  321. }
  322. }
  323. dumpData(task, level, source = "output") {
  324. let data;
  325. switch (source) {
  326. case "output":
  327. data = task.output;
  328. break;
  329. case "skip":
  330. data = task.message.skip;
  331. break;
  332. case "error":
  333. data = task.message.error;
  334. break;
  335. }
  336. if (task.hasTitle() && source === "error" && data === task.title) {
  337. return;
  338. }
  339. if (typeof data === "string") {
  340. return this.formatString(data, this.getSymbol(task, true), level + 1);
  341. }
  342. }
  343. formatString(str, icon, level) {
  344. if (str.trim() === "") {
  345. return;
  346. }
  347. str = `${icon} ${str}`;
  348. let parsedStr;
  349. let columns = process.stdout.columns ? process.stdout.columns : 80;
  350. columns = columns - level * this.options.indentation - 2;
  351. switch (this.options.formatOutput) {
  352. case "truncate":
  353. parsedStr = str.split(EOL).map((s, i) => {
  354. return cliTruncate(this.indentMultilineOutput(s, i), columns);
  355. });
  356. break;
  357. case "wrap":
  358. parsedStr = cliWrap(str, columns, { hard: true }).split(EOL).map((s, i) => this.indentMultilineOutput(s, i));
  359. break;
  360. default:
  361. throw new Error("Format option for the renderer is wrong.");
  362. }
  363. if (this.options.removeEmptyLines) {
  364. parsedStr = parsedStr.filter(Boolean);
  365. }
  366. return indentString(parsedStr.join(EOL), level * this.options.indentation);
  367. }
  368. indentMultilineOutput(str, i) {
  369. return i > 0 ? indentString(str.trim(), 2) : str.trim();
  370. }
  371. getSymbol(task, data = false) {
  372. var _a2, _b, _c;
  373. if (task.isPending() && !data) {
  374. return ((_a2 = this.options) == null ? void 0 : _a2.lazy) || this.getSelfOrParentOption(task, "showSubtasks") !== false && task.hasSubtasks() && !task.subtasks.every((subtask) => !subtask.hasTitle()) ? colorette_default.yellow(figures.pointer) : colorette_default.yellowBright(this.spinner[this.spinnerPosition]);
  375. } else if (task.isCompleted() && !data) {
  376. return task.hasSubtasks() && task.subtasks.some((subtask) => subtask.hasFailed()) ? colorette_default.yellow(figures.warning) : colorette_default.green(figures.tick);
  377. } else if (task.isRetrying() && !data) {
  378. return ((_b = this.options) == null ? void 0 : _b.lazy) ? colorette_default.yellow(figures.warning) : colorette_default.yellow(this.spinner[this.spinnerPosition]);
  379. } else if (task.isRollingBack() && !data) {
  380. return ((_c = this.options) == null ? void 0 : _c.lazy) ? colorette_default.red(figures.warning) : colorette_default.red(this.spinner[this.spinnerPosition]);
  381. } else if (task.hasRolledBack() && !data) {
  382. return colorette_default.red(figures.arrowLeft);
  383. } else if (task.hasFailed() && !data) {
  384. return task.hasSubtasks() ? colorette_default.red(figures.pointer) : colorette_default.red(figures.cross);
  385. } else if (task.isSkipped() && !data && this.getSelfOrParentOption(task, "collapseSkips") === false) {
  386. return colorette_default.yellow(figures.warning);
  387. } else if (task.isSkipped() && (data || this.getSelfOrParentOption(task, "collapseSkips"))) {
  388. return colorette_default.yellow(figures.arrowDown);
  389. }
  390. return !data ? colorette_default.dim(figures.squareSmallFilled) : figures.pointerSmall;
  391. }
  392. addSuffixToMessage(message, suffix, condition) {
  393. return condition ?? true ? message + colorette_default.dim(` [${suffix}]`) : message;
  394. }
  395. };
  396. var DefaultRenderer = _DefaultRenderer;
  397. DefaultRenderer.nonTTY = false;
  398. DefaultRenderer.rendererOptions = {
  399. indentation: 2,
  400. clearOutput: false,
  401. showSubtasks: true,
  402. collapse: true,
  403. collapseSkips: true,
  404. showSkipMessage: true,
  405. suffixSkips: true,
  406. collapseErrors: true,
  407. showErrorMessage: true,
  408. suffixRetries: true,
  409. lazy: false,
  410. showTimer: false,
  411. removeEmptyLines: true,
  412. formatOutput: "truncate"
  413. };
  414. // src/renderer/silent.renderer.ts
  415. var SilentRenderer = class {
  416. constructor(tasks, options) {
  417. this.tasks = tasks;
  418. this.options = options;
  419. }
  420. render() {
  421. }
  422. end() {
  423. }
  424. };
  425. SilentRenderer.nonTTY = true;
  426. // src/renderer/simple.renderer.ts
  427. import { stderr as logUpdate2 } from "log-update";
  428. import { EOL as EOL2 } from "os";
  429. var _SimpleRenderer = class {
  430. constructor(tasks, options) {
  431. this.tasks = tasks;
  432. this.options = options;
  433. this.eventTypeRendererMap = {
  434. ["SUBTASK" /* SUBTASK */]: (task) => {
  435. if (task.hasTitle()) {
  436. this.log(`${colorette_default.blue(figures.pointer)} ${task.title}`);
  437. }
  438. if (task.hasSubtasks()) {
  439. this.render(task.subtasks);
  440. }
  441. },
  442. ["STATE" /* STATE */]: (task) => {
  443. if (task.isCompleted() && task.hasTitle()) {
  444. this.log(`${colorette_default.green(figures.tick)} ${task.title}`);
  445. }
  446. },
  447. ["DATA" /* DATA */]: (task, event) => {
  448. if (task.isPrompt() && !String(event.data).match(/^\n$/)) {
  449. logUpdate2(`${event.data}`);
  450. } else {
  451. this.log(`${figures.pointerSmall} ${event.data}`);
  452. }
  453. },
  454. ["MESSAGE" /* MESSAGE */]: (task, event) => {
  455. if (event.data.error) {
  456. const title = _SimpleRenderer.formatTitle(task);
  457. this.log(`${colorette_default.red(figures.cross)}${title}: ${event.data.error}`);
  458. } else if (event.data.skip) {
  459. const title = _SimpleRenderer.formatTitle(task);
  460. const skip = task.title !== event.data.skip ? `: ${event.data.skip}` : "";
  461. this.log(`${colorette_default.yellow(figures.arrowDown)}${title} [${colorette_default.yellow(`skipped${skip}`)}]`);
  462. } else if (event.data.rollback) {
  463. const title = _SimpleRenderer.formatTitle(task);
  464. this.log(`${colorette_default.red(figures.arrowLeft)}${title}: ${event.data.rollback}`);
  465. } else if (event.data.retry) {
  466. const title = _SimpleRenderer.formatTitle(task);
  467. this.log(`[${colorette_default.yellow(`${event.data.retry.count}`)}]${title}`);
  468. }
  469. }
  470. };
  471. this.options = { ..._SimpleRenderer.rendererOptions, ...options };
  472. }
  473. static now() {
  474. return new Date();
  475. }
  476. static formatTitle(task) {
  477. return (task == null ? void 0 : task.title) ? ` ${task.title}` : "";
  478. }
  479. log(output) {
  480. const logOut = (msg) => {
  481. process[this.options.output].write(msg.endsWith(EOL2) ? msg : `${msg}${EOL2}`);
  482. };
  483. if (!this.options.prefixWithTimestamp) {
  484. logOut(`${output}`);
  485. return;
  486. }
  487. const now = _SimpleRenderer.now();
  488. const timestamp = String(now.getHours()).padStart(2, "0") + ":" + String(now.getMinutes()).padStart(2, "0") + ":" + String(now.getSeconds()).padStart(2, "0");
  489. logOut(`${colorette_default.dim(`[${timestamp}]`)} ${output}`);
  490. }
  491. end() {
  492. }
  493. render(tasks) {
  494. if (tasks == null ? void 0 : tasks.length) {
  495. tasks.forEach((task) => {
  496. task.subscribe((event) => {
  497. var _a2, _b;
  498. (_b = (_a2 = this.eventTypeRendererMap)[event.type]) == null ? void 0 : _b.call(_a2, task, event);
  499. }, this.log);
  500. });
  501. } else {
  502. this.render(this.tasks);
  503. }
  504. }
  505. };
  506. var SimpleRenderer = _SimpleRenderer;
  507. SimpleRenderer.nonTTY = true;
  508. SimpleRenderer.rendererOptions = { prefixWithTimestamp: false, output: "stdout" };
  509. // src/utils/logger.constants.ts
  510. var LogLevels = /* @__PURE__ */ ((LogLevels2) => {
  511. LogLevels2["SILENT"] = "SILENT";
  512. LogLevels2["FAILED"] = "FAILED";
  513. LogLevels2["SKIPPED"] = "SKIPPED";
  514. LogLevels2["SUCCESS"] = "SUCCESS";
  515. LogLevels2["DATA"] = "DATA";
  516. LogLevels2["STARTED"] = "STARTED";
  517. LogLevels2["TITLE"] = "TITLE";
  518. LogLevels2["RETRY"] = "RETRY";
  519. LogLevels2["ROLLBACK"] = "ROLLBACK";
  520. return LogLevels2;
  521. })(LogLevels || {});
  522. // src/utils/logger.ts
  523. var Logger = class {
  524. constructor(options) {
  525. this.options = options;
  526. }
  527. fail(message) {
  528. message = this.parseMessage("FAILED" /* FAILED */, message);
  529. console.error(message);
  530. }
  531. skip(message) {
  532. message = this.parseMessage("SKIPPED" /* SKIPPED */, message);
  533. console.info(message);
  534. }
  535. success(message) {
  536. message = this.parseMessage("SUCCESS" /* SUCCESS */, message);
  537. console.log(message);
  538. }
  539. data(message) {
  540. message = this.parseMessage("DATA" /* DATA */, message);
  541. console.info(message);
  542. }
  543. start(message) {
  544. message = this.parseMessage("STARTED" /* STARTED */, message);
  545. console.log(message);
  546. }
  547. title(message) {
  548. message = this.parseMessage("TITLE" /* TITLE */, message);
  549. console.info(message);
  550. }
  551. retry(message) {
  552. message = this.parseMessage("RETRY" /* RETRY */, message);
  553. console.warn(message);
  554. }
  555. rollback(message) {
  556. message = this.parseMessage("ROLLBACK" /* ROLLBACK */, message);
  557. console.warn(message);
  558. }
  559. parseMessage(level, message) {
  560. let multiLineMessage;
  561. try {
  562. multiLineMessage = message.split("\n");
  563. } catch {
  564. multiLineMessage = [message];
  565. }
  566. multiLineMessage = multiLineMessage.map((msg) => {
  567. return this.logColoring({
  568. level,
  569. message: msg
  570. });
  571. });
  572. message = multiLineMessage.join("\n");
  573. return message;
  574. }
  575. logColoring({ level, message }) {
  576. var _a2, _b, _c, _d, _e, _f, _g, _h;
  577. let icon;
  578. let coloring = (input) => {
  579. return input;
  580. };
  581. switch (level) {
  582. case "FAILED" /* FAILED */:
  583. if ((_a2 = this.options) == null ? void 0 : _a2.useIcons) {
  584. coloring = colorette_default.red;
  585. icon = figures.cross;
  586. } else {
  587. icon = this.wrapInBrackets(level);
  588. }
  589. break;
  590. case "SKIPPED" /* SKIPPED */:
  591. if ((_b = this.options) == null ? void 0 : _b.useIcons) {
  592. coloring = colorette_default.yellow;
  593. icon = figures.arrowDown;
  594. } else {
  595. icon = this.wrapInBrackets(level);
  596. }
  597. break;
  598. case "SUCCESS" /* SUCCESS */:
  599. if ((_c = this.options) == null ? void 0 : _c.useIcons) {
  600. coloring = colorette_default.green;
  601. icon = figures.tick;
  602. } else {
  603. icon = this.wrapInBrackets(level);
  604. }
  605. break;
  606. case "DATA" /* DATA */:
  607. if ((_d = this.options) == null ? void 0 : _d.useIcons) {
  608. icon = figures.arrowRight;
  609. } else {
  610. icon = this.wrapInBrackets(level);
  611. }
  612. break;
  613. case "STARTED" /* STARTED */:
  614. if ((_e = this.options) == null ? void 0 : _e.useIcons) {
  615. icon = figures.pointer;
  616. } else {
  617. icon = this.wrapInBrackets(level);
  618. }
  619. break;
  620. case "TITLE" /* TITLE */:
  621. if ((_f = this.options) == null ? void 0 : _f.useIcons) {
  622. icon = figures.checkboxOn;
  623. } else {
  624. icon = this.wrapInBrackets(level);
  625. }
  626. break;
  627. case "RETRY" /* RETRY */:
  628. if ((_g = this.options) == null ? void 0 : _g.useIcons) {
  629. coloring = colorette_default.yellow;
  630. icon = figures.pointer;
  631. } else {
  632. icon = this.wrapInBrackets(level);
  633. }
  634. break;
  635. case "ROLLBACK" /* ROLLBACK */:
  636. if ((_h = this.options) == null ? void 0 : _h.useIcons) {
  637. coloring = colorette_default.red;
  638. icon = figures.arrowLeft;
  639. } else {
  640. icon = this.wrapInBrackets(level);
  641. }
  642. break;
  643. }
  644. return coloring(`${icon} ${message}`);
  645. }
  646. wrapInBrackets(level) {
  647. return `[${level}]`;
  648. }
  649. };
  650. // src/renderer/verbose.renderer.ts
  651. var _VerboseRenderer = class {
  652. constructor(tasks, options) {
  653. this.tasks = tasks;
  654. this.options = options;
  655. var _a2, _b, _c, _d;
  656. if (((_a2 = this.options) == null ? void 0 : _a2.logger) && ((_b = this.options) == null ? void 0 : _b.options)) {
  657. this.logger = new this.options.logger(this.options.options);
  658. } else if ((_c = this.options) == null ? void 0 : _c.logger) {
  659. this.logger = new this.options.logger();
  660. } else {
  661. this.logger = new Logger({ useIcons: (_d = this.options) == null ? void 0 : _d.useIcons });
  662. }
  663. this.options = { ..._VerboseRenderer.rendererOptions, ...this.options };
  664. }
  665. render() {
  666. this.verboseRenderer(this.tasks);
  667. }
  668. end() {
  669. }
  670. verboseRenderer(tasks) {
  671. return tasks == null ? void 0 : tasks.forEach((task) => {
  672. task.subscribe(
  673. (event) => {
  674. var _a2, _b, _c, _d, _e, _f, _g, _h;
  675. if (task.isEnabled()) {
  676. const taskTitle = task.hasTitle() ? task.title : "Task without title.";
  677. if (event.type === "SUBTASK" /* SUBTASK */ && task.hasSubtasks()) {
  678. this.verboseRenderer(task.subtasks);
  679. } else if (event.type === "STATE" /* STATE */) {
  680. if (((_a2 = this.options) == null ? void 0 : _a2.logEmptyTitle) !== false || task.hasTitle()) {
  681. if (task.isPending()) {
  682. this.logger.start(taskTitle);
  683. } else if (task.isCompleted()) {
  684. this.logger.success(taskTitle + (((_b = this.options) == null ? void 0 : _b.showTimer) && ((_c = task.message) == null ? void 0 : _c.duration) ? ` [${parseTaskTime(task.message.duration)}]` : ""));
  685. }
  686. }
  687. } else if (event.type === "DATA" /* DATA */ && !!event.data) {
  688. this.logger.data(String(event.data));
  689. } else if (event.type === "TITLE" /* TITLE */) {
  690. if (((_d = this.options) == null ? void 0 : _d.logTitleChange) !== false) {
  691. this.logger.title(String(event.data));
  692. }
  693. } else if (event.type === "MESSAGE" /* MESSAGE */) {
  694. if ((_e = event.data) == null ? void 0 : _e.error) {
  695. this.logger.fail(String(event.data.error));
  696. } else if ((_f = event.data) == null ? void 0 : _f.skip) {
  697. this.logger.skip(String(event.data.skip));
  698. } else if ((_g = event.data) == null ? void 0 : _g.rollback) {
  699. this.logger.rollback(String(event.data.rollback));
  700. } else if ((_h = event.data) == null ? void 0 : _h.retry) {
  701. this.logger.retry(`[${event.data.retry.count}] ` + String(taskTitle));
  702. }
  703. }
  704. }
  705. },
  706. (err) => {
  707. this.logger.fail(err);
  708. }
  709. );
  710. });
  711. }
  712. };
  713. var VerboseRenderer = _VerboseRenderer;
  714. VerboseRenderer.nonTTY = true;
  715. VerboseRenderer.rendererOptions = {
  716. useIcons: false,
  717. logEmptyTitle: true,
  718. logTitleChange: true
  719. };
  720. // src/utils/renderer.ts
  721. var renderers = {
  722. default: DefaultRenderer,
  723. simple: SimpleRenderer,
  724. verbose: VerboseRenderer,
  725. silent: SilentRenderer
  726. };
  727. function isRendererSupported(renderer) {
  728. return process.stdout.isTTY === true || renderer.nonTTY === true;
  729. }
  730. function getRendererClass(renderer) {
  731. if (typeof renderer === "string") {
  732. return renderers[renderer] || renderers.default;
  733. }
  734. return typeof renderer === "function" ? renderer : renderers.default;
  735. }
  736. function getRenderer(renderer, fallbackRenderer, fallbackCondition, silentCondition) {
  737. let returnValue;
  738. let ret = getRendererClass(renderer);
  739. returnValue = { renderer: ret, nonTTY: false };
  740. const evaluateSilent = assertFunctionOrSelf(silentCondition);
  741. const evaluateFallback = assertFunctionOrSelf(fallbackCondition);
  742. if (evaluateSilent) {
  743. ret = getRendererClass("silent");
  744. returnValue = { renderer: ret, nonTTY: true };
  745. } else if (!isRendererSupported(ret) || evaluateFallback) {
  746. ret = getRendererClass(fallbackRenderer);
  747. returnValue = { renderer: ret, nonTTY: true };
  748. }
  749. return returnValue;
  750. }
  751. // src/utils/uuid.ts
  752. function generateUUID() {
  753. return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
  754. const r = Math.random() * 16 || 0;
  755. const v = c === "x" ? r : r && 3 || 8;
  756. return v.toString(16);
  757. });
  758. }
  759. // src/lib/task.ts
  760. var Task = class extends Subject {
  761. constructor(listr, tasks, options, rendererOptions) {
  762. var _a2, _b, _c, _d;
  763. super();
  764. this.listr = listr;
  765. this.tasks = tasks;
  766. this.options = options;
  767. this.rendererOptions = rendererOptions;
  768. this.message = {};
  769. this.id = generateUUID();
  770. this.title = (_a2 = this.tasks) == null ? void 0 : _a2.title;
  771. this.initialTitle = (_b = this.tasks) == null ? void 0 : _b.title;
  772. this.task = this.tasks.task;
  773. this.skip = ((_c = this.tasks) == null ? void 0 : _c.skip) ?? false;
  774. this.enabledFn = ((_d = this.tasks) == null ? void 0 : _d.enabled) ?? true;
  775. this.rendererTaskOptions = this.tasks.options;
  776. this.renderHook$ = this.listr.renderHook$;
  777. this.subscribe(() => {
  778. this.renderHook$.next();
  779. });
  780. }
  781. set state$(state) {
  782. this.state = state;
  783. this.next({
  784. type: "STATE" /* STATE */,
  785. data: state
  786. });
  787. if (this.hasSubtasks() && this.hasFailed()) {
  788. for (const subtask of this.subtasks) {
  789. if (subtask.state === "PENDING" /* PENDING */) {
  790. subtask.state$ = "FAILED" /* FAILED */;
  791. }
  792. }
  793. }
  794. }
  795. set output$(data) {
  796. this.output = data;
  797. this.next({
  798. type: "DATA" /* DATA */,
  799. data
  800. });
  801. }
  802. set message$(data) {
  803. this.message = { ...this.message, ...data };
  804. this.next({
  805. type: "MESSAGE" /* MESSAGE */,
  806. data
  807. });
  808. }
  809. set title$(title) {
  810. this.title = title;
  811. this.next({
  812. type: "TITLE" /* TITLE */,
  813. data: title
  814. });
  815. }
  816. async check(ctx) {
  817. if (this.state === void 0) {
  818. this.enabled = await assertFunctionOrSelf(this.enabledFn, ctx);
  819. this.next({
  820. type: "ENABLED" /* ENABLED */,
  821. data: this.enabled
  822. });
  823. }
  824. }
  825. hasSubtasks() {
  826. var _a2;
  827. return ((_a2 = this.subtasks) == null ? void 0 : _a2.length) > 0;
  828. }
  829. isPending() {
  830. return this.state === "PENDING" /* PENDING */;
  831. }
  832. isSkipped() {
  833. return this.state === "SKIPPED" /* SKIPPED */;
  834. }
  835. isCompleted() {
  836. return this.state === "COMPLETED" /* COMPLETED */;
  837. }
  838. hasFailed() {
  839. return this.state === "FAILED" /* FAILED */;
  840. }
  841. isRollingBack() {
  842. return this.state === "ROLLING_BACK" /* ROLLING_BACK */;
  843. }
  844. hasRolledBack() {
  845. return this.state === "ROLLED_BACK" /* ROLLED_BACK */;
  846. }
  847. isRetrying() {
  848. return this.state === "RETRY" /* RETRY */;
  849. }
  850. isEnabled() {
  851. return this.enabled;
  852. }
  853. hasTitle() {
  854. return typeof (this == null ? void 0 : this.title) === "string";
  855. }
  856. isPrompt() {
  857. return !!this.prompt;
  858. }
  859. async run(context, wrapper) {
  860. var _a2, _b, _c, _d, _e;
  861. const handleResult = (result) => {
  862. if (result instanceof Listr) {
  863. result.options = { ...this.options, ...result.options };
  864. result.rendererClass = getRenderer("silent").renderer;
  865. result.renderHook$.subscribe(() => {
  866. this.renderHook$.next();
  867. });
  868. this.subtasks = result.tasks;
  869. result.err = this.listr.err;
  870. this.next({ type: "SUBTASK" /* SUBTASK */ });
  871. result = result.run(context);
  872. } else if (this.isPrompt()) {
  873. } else if (result instanceof Promise) {
  874. result = result.then(handleResult);
  875. } else if (result instanceof Readable) {
  876. result = new Promise((resolve, reject) => {
  877. result.on("data", (data) => {
  878. this.output$ = data.toString();
  879. });
  880. result.on("error", (error) => reject(error));
  881. result.on("end", () => resolve(null));
  882. });
  883. } else if (isObservable(result)) {
  884. result = new Promise((resolve, reject) => {
  885. result.subscribe({
  886. next: (data) => {
  887. this.output$ = data;
  888. },
  889. error: reject,
  890. complete: resolve
  891. });
  892. });
  893. }
  894. return result;
  895. };
  896. const startTime = Date.now();
  897. this.state$ = "PENDING" /* PENDING */;
  898. const skipped = await assertFunctionOrSelf(this.skip, context);
  899. if (skipped) {
  900. if (typeof skipped === "string") {
  901. this.message$ = { skip: skipped };
  902. } else if (this.hasTitle()) {
  903. this.message$ = { skip: this.title };
  904. } else {
  905. this.message$ = { skip: "Skipped task without a title." };
  906. }
  907. this.state$ = "SKIPPED" /* SKIPPED */;
  908. return;
  909. }
  910. try {
  911. const retryCount = ((_a2 = this.tasks) == null ? void 0 : _a2.retry) && ((_b = this.tasks) == null ? void 0 : _b.retry) > 0 ? this.tasks.retry + 1 : 1;
  912. for (let retries = 1; retries <= retryCount; retries++) {
  913. try {
  914. await handleResult(this.task(context, wrapper));
  915. break;
  916. } catch (err) {
  917. if (retries !== retryCount) {
  918. this.retry = { count: retries, withError: err };
  919. this.message$ = { retry: this.retry };
  920. this.title$ = this.initialTitle;
  921. this.output = void 0;
  922. wrapper.report(err, "WILL_RETRY" /* WILL_RETRY */);
  923. this.state$ = "RETRY" /* RETRY */;
  924. } else {
  925. throw err;
  926. }
  927. }
  928. }
  929. if (this.isPending() || this.isRetrying()) {
  930. this.message$ = { duration: Date.now() - startTime };
  931. this.state$ = "COMPLETED" /* COMPLETED */;
  932. }
  933. } catch (error) {
  934. if (this.prompt instanceof PromptError) {
  935. error = new Error(this.prompt.message);
  936. }
  937. if ((_c = this.tasks) == null ? void 0 : _c.rollback) {
  938. wrapper.report(error, "WILL_ROLLBACK" /* WILL_ROLLBACK */);
  939. try {
  940. this.state$ = "ROLLING_BACK" /* ROLLING_BACK */;
  941. await this.tasks.rollback(context, wrapper);
  942. this.state$ = "ROLLED_BACK" /* ROLLED_BACK */;
  943. this.message$ = { rollback: this.title };
  944. } catch (err) {
  945. this.state$ = "FAILED" /* FAILED */;
  946. wrapper.report(err, "HAS_FAILED_TO_ROLLBACK" /* HAS_FAILED_TO_ROLLBACK */);
  947. throw err;
  948. }
  949. if (((_d = this.listr.options) == null ? void 0 : _d.exitAfterRollback) !== false) {
  950. throw new Error(this.title);
  951. }
  952. } else {
  953. this.state$ = "FAILED" /* FAILED */;
  954. if (this.listr.options.exitOnError !== false && await assertFunctionOrSelf((_e = this.tasks) == null ? void 0 : _e.exitOnError, context) !== false) {
  955. wrapper.report(error, "HAS_FAILED" /* HAS_FAILED */);
  956. throw error;
  957. } else if (!this.hasSubtasks()) {
  958. wrapper.report(error, "HAS_FAILED_WITHOUT_ERROR" /* HAS_FAILED_WITHOUT_ERROR */);
  959. }
  960. }
  961. } finally {
  962. this.complete();
  963. }
  964. }
  965. };
  966. // src/lib/task-wrapper.ts
  967. import through from "through";
  968. // src/constants/clearline-regex.constants.ts
  969. var CLEAR_LINE_REGEX = "(?:\\u001b|\\u009b)\\[[\\=><~/#&.:=?%@~_-]*[0-9]*[\\a-ln-tqyz=><~/#&.:=?%@~_-]+";
  970. var BELL_REGEX = /\u0007/;
  971. // src/utils/prompt.ts
  972. function defaultCancelCallback(settings) {
  973. const errorMsg = "Cancelled prompt.";
  974. if (this instanceof TaskWrapper) {
  975. this.task.prompt = new PromptError(errorMsg);
  976. } else if ((settings == null ? void 0 : settings.error) !== false) {
  977. throw new Error(errorMsg);
  978. } else {
  979. return errorMsg;
  980. }
  981. }
  982. async function createPrompt(options, settings) {
  983. let cancelCallback;
  984. if (settings == null ? void 0 : settings.cancelCallback) {
  985. cancelCallback = settings.cancelCallback;
  986. } else {
  987. cancelCallback = defaultCancelCallback;
  988. }
  989. if (!Array.isArray(options)) {
  990. options = [{ ...options, name: "default" }];
  991. } else if (options.length === 1) {
  992. options = options.reduce((o, option) => {
  993. return [...o, Object.assign(option, { name: "default" })];
  994. }, []);
  995. }
  996. options = options.reduce((o, option) => {
  997. return [
  998. ...o,
  999. Object.assign(option, {
  1000. stdout: this instanceof TaskWrapper ? (settings == null ? void 0 : settings.stdout) ?? this.stdout() : process.stdout,
  1001. onCancel: cancelCallback.bind(this, settings)
  1002. })
  1003. ];
  1004. }, []);
  1005. let enquirer;
  1006. if (settings == null ? void 0 : settings.enquirer) {
  1007. enquirer = settings.enquirer;
  1008. } else {
  1009. try {
  1010. const imported = await import("enquirer");
  1011. enquirer = imported.default ? new imported.default() : new imported();
  1012. } catch (e) {
  1013. this.task.prompt = new PromptError("Enquirer is a peer dependency that must be installed separately.");
  1014. throw new Error(e);
  1015. }
  1016. }
  1017. if (this instanceof TaskWrapper) {
  1018. enquirer.on("prompt", (prompt) => this.task.prompt = prompt);
  1019. enquirer.on("submit", () => this.task.prompt = void 0);
  1020. this.task.subscribe((event) => {
  1021. if (event.type === "STATE" /* STATE */ && event.data === "SKIPPED" /* SKIPPED */) {
  1022. if (this.task.prompt && !(this.task.prompt instanceof PromptError)) {
  1023. this.task.prompt.submit();
  1024. }
  1025. }
  1026. });
  1027. }
  1028. const response = await enquirer.prompt(options);
  1029. if (options.length === 1) {
  1030. return response.default;
  1031. } else {
  1032. return response;
  1033. }
  1034. }
  1035. function destroyPrompt(throwError = false) {
  1036. if (!this.task.prompt || this.task.prompt instanceof PromptError) {
  1037. return;
  1038. }
  1039. if (throwError) {
  1040. this.task.prompt.cancel();
  1041. } else {
  1042. this.task.prompt.submit();
  1043. }
  1044. }
  1045. // src/lib/task-wrapper.ts
  1046. var TaskWrapper = class {
  1047. constructor(task, errors, options) {
  1048. this.task = task;
  1049. this.errors = errors;
  1050. this.options = options;
  1051. }
  1052. get title() {
  1053. return this.task.title;
  1054. }
  1055. set title(data) {
  1056. this.task.title$ = data;
  1057. }
  1058. get output() {
  1059. return this.task.output;
  1060. }
  1061. set output(data) {
  1062. this.task.output$ = data;
  1063. }
  1064. newListr(task, options) {
  1065. let tasks;
  1066. if (typeof task === "function") {
  1067. tasks = task(this);
  1068. } else {
  1069. tasks = task;
  1070. }
  1071. return new Listr(tasks, options, this.task);
  1072. }
  1073. report(error, type) {
  1074. var _a2;
  1075. if (this.task.options.collectErrors !== false) {
  1076. this.errors.push(new ListrError(error, type, this.task));
  1077. }
  1078. this.task.message$ = { error: error.message ?? ((_a2 = this.task) == null ? void 0 : _a2.title) ?? "Task with no title." };
  1079. }
  1080. skip(message) {
  1081. var _a2;
  1082. this.task.state$ = "SKIPPED" /* SKIPPED */;
  1083. if (message) {
  1084. this.task.message$ = { skip: message ?? ((_a2 = this.task) == null ? void 0 : _a2.title) ?? "Task with no title." };
  1085. }
  1086. }
  1087. isRetrying() {
  1088. return this.task.isRetrying() ? this.task.retry : { count: 0 };
  1089. }
  1090. async prompt(options) {
  1091. var _a2;
  1092. return createPrompt.bind(this)(options, { ...(_a2 = this.options) == null ? void 0 : _a2.injectWrapper });
  1093. }
  1094. cancelPrompt(throwError = false) {
  1095. return destroyPrompt.bind(this)(throwError);
  1096. }
  1097. stdout() {
  1098. return through((chunk) => {
  1099. chunk = chunk.toString();
  1100. chunk = chunk.replace(new RegExp(CLEAR_LINE_REGEX, "gmi"), "");
  1101. chunk = chunk.replace(new RegExp(BELL_REGEX, "gmi"), "");
  1102. if (chunk !== "") {
  1103. this.output = chunk;
  1104. }
  1105. });
  1106. }
  1107. run(ctx) {
  1108. return this.task.run(ctx, this);
  1109. }
  1110. };
  1111. // src/listr.ts
  1112. var Listr = class {
  1113. constructor(task, options, parentTask) {
  1114. this.task = task;
  1115. this.options = options;
  1116. this.parentTask = parentTask;
  1117. this.tasks = [];
  1118. this.err = [];
  1119. this.renderHook$ = new Subject2();
  1120. this.path = [];
  1121. var _a2, _b, _c;
  1122. this.options = {
  1123. ...{
  1124. concurrent: false,
  1125. renderer: "default",
  1126. nonTTYRenderer: "verbose",
  1127. exitOnError: true,
  1128. exitAfterRollback: true,
  1129. collectErrors: "minimal",
  1130. registerSignalListeners: true
  1131. },
  1132. ...options
  1133. };
  1134. if (this.options.concurrent === true) {
  1135. this.concurrency = Infinity;
  1136. } else if (typeof this.options.concurrent === "number") {
  1137. this.concurrency = this.options.concurrent;
  1138. } else {
  1139. this.concurrency = 1;
  1140. }
  1141. const renderer = getRenderer(this.options.renderer, this.options.nonTTYRenderer, (_a2 = this.options) == null ? void 0 : _a2.rendererFallback, (_b = this.options) == null ? void 0 : _b.rendererSilent);
  1142. this.rendererClass = renderer.renderer;
  1143. if (!renderer.nonTTY) {
  1144. this.rendererClassOptions = this.options.rendererOptions;
  1145. } else {
  1146. this.rendererClassOptions = this.options.nonTTYRendererOptions;
  1147. }
  1148. this.add(task ?? []);
  1149. if (parentTask) {
  1150. this.path = [...parentTask.listr.path, parentTask.title];
  1151. }
  1152. if (this.options.registerSignalListeners) {
  1153. process.once("SIGINT", () => {
  1154. this.tasks.forEach(async (task2) => {
  1155. if (task2.isPending()) {
  1156. task2.state$ = "FAILED" /* FAILED */;
  1157. }
  1158. });
  1159. this.renderer.end(new Error("Interrupted."));
  1160. process.exit(127);
  1161. }).setMaxListeners(0);
  1162. }
  1163. if ((_c = this.options) == null ? void 0 : _c.disableColor) {
  1164. process.env.LISTR_DISABLE_COLOR = "1";
  1165. }
  1166. }
  1167. add(task) {
  1168. const tasks = Array.isArray(task) ? task : [task];
  1169. tasks.forEach((task2) => {
  1170. this.tasks.push(new Task(this, task2, this.options, { ...this.rendererClassOptions, ...task2.options }));
  1171. });
  1172. }
  1173. async run(context) {
  1174. var _a2;
  1175. if (!this.renderer) {
  1176. this.renderer = new this.rendererClass(this.tasks, this.rendererClassOptions, this.renderHook$);
  1177. }
  1178. this.renderer.render();
  1179. this.ctx = ((_a2 = this.options) == null ? void 0 : _a2.ctx) ?? context ?? {};
  1180. await this.checkAll(this.ctx);
  1181. try {
  1182. await pMap(
  1183. this.tasks,
  1184. async (task) => {
  1185. await task.check(this.ctx);
  1186. return this.runTask(task, this.ctx, this.err);
  1187. },
  1188. { concurrency: this.concurrency }
  1189. );
  1190. this.renderer.end();
  1191. } catch (err) {
  1192. if (this.options.exitOnError !== false) {
  1193. this.renderer.end(err);
  1194. throw err;
  1195. }
  1196. }
  1197. return this.ctx;
  1198. }
  1199. checkAll(context) {
  1200. return Promise.all(this.tasks.map((task) => task.check(context)));
  1201. }
  1202. runTask(task, context, errors) {
  1203. if (!task.isEnabled()) {
  1204. return Promise.resolve();
  1205. }
  1206. return new TaskWrapper(task, errors, this.options).run(context);
  1207. }
  1208. };
  1209. // src/manager.ts
  1210. var Manager = class {
  1211. constructor(options) {
  1212. this.options = options;
  1213. this.err = [];
  1214. this.tasks = [];
  1215. }
  1216. set ctx(ctx) {
  1217. this.options.ctx = ctx;
  1218. }
  1219. add(tasks, options) {
  1220. options = { ...this.options, ...options };
  1221. this.tasks = [...this.tasks, this.indent(tasks, options)];
  1222. }
  1223. async runAll(options) {
  1224. options = { ...this.options, ...options };
  1225. const ctx = await this.run(this.tasks, options);
  1226. this.tasks = [];
  1227. return ctx;
  1228. }
  1229. newListr(tasks, options) {
  1230. return new Listr(tasks, options);
  1231. }
  1232. indent(tasks, options, taskOptions) {
  1233. options = { ...this.options, ...options };
  1234. let newTask;
  1235. if (typeof tasks === "function") {
  1236. newTask = {
  1237. ...taskOptions,
  1238. task: (ctx) => this.newListr(tasks(ctx), options)
  1239. };
  1240. } else {
  1241. newTask = {
  1242. ...taskOptions,
  1243. task: () => this.newListr(tasks, options)
  1244. };
  1245. }
  1246. return newTask;
  1247. }
  1248. async run(tasks, options) {
  1249. options = { ...this.options, ...options };
  1250. const task = this.newListr(tasks, options);
  1251. const ctx = await task.run();
  1252. this.err = task.err;
  1253. return ctx;
  1254. }
  1255. getRuntime(pipetime) {
  1256. return `${Math.round(Date.now() - pipetime) / 1e3}s`;
  1257. }
  1258. };
  1259. export {
  1260. Listr,
  1261. ListrError,
  1262. ListrErrorTypes,
  1263. ListrEventType,
  1264. ListrTaskState,
  1265. LogLevels,
  1266. Logger,
  1267. Manager,
  1268. PromptError,
  1269. createPrompt,
  1270. destroyPrompt,
  1271. figures
  1272. };