版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1344 lines
45 KiB

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