{"version":3,"sources":["../src/index.ts","../src/ProgressBar.ts","../src/constants.ts"],"sourcesContent":["import ProgressBar from './ProgressBar';\n\nexport { ProgressBar };\n","import { EOL } from 'node:os';\nimport { style } from '@opentf/cli-styles';\nimport {\n  compact,\n  intersperse,\n  isObj,\n  percentage,\n  percentageOf,\n  shallowMerge,\n} from '@opentf/std';\nimport { type Bar, type BarSize, type Options } from './types';\nimport {\n  DEFAULT_BAR_CHAR,\n  MEDIUM_BAR_CHAR,\n  PLAIN_DONE_BAR_CHAR,\n  PLAIN_NOT_DONE_BAR_CHAR,\n  SMALL_BAR_CHAR,\n} from './constants';\n\nclass ProgressBar {\n  private _options: Options = {\n    stream: process.stderr,\n    width: 30,\n    color: 'g',\n    bgColor: 'gr',\n    autoClear: false,\n    size: 'DEFAULT',\n    prefix: '',\n    suffix: '',\n    showPercent: true,\n    showCount: false,\n    variant: 'STANDARD',\n  };\n  private _bars: Bar[];\n\n  constructor(options?: Partial<Options>) {\n    const opts =\n      options?.variant === 'PLAIN'\n        ? { ...this._options, color: '', bgColor: '' }\n        : this._options;\n    this._options = shallowMerge(opts, options as object) as Options;\n    this._bars = [];\n  }\n\n  private _getBarCharBySize(size: BarSize | undefined) {\n    const s = size || this._options.size;\n    if (s === 'SMALL') {\n      return SMALL_BAR_CHAR;\n    } else if (s === 'MEDIUM') {\n      return MEDIUM_BAR_CHAR;\n    }\n\n    return DEFAULT_BAR_CHAR;\n  }\n\n  private _getBars(bar: Bar, percent: number): string {\n    let doneBars, bgBars;\n    const color = bar.color || this._options.color;\n    const bgColor = bar.bgColor || this._options.bgColor;\n    const percentVal = Math.trunc(percentageOf(percent, this._options.width));\n\n    if (this._options.variant === 'PLAIN') {\n      doneBars = style(`$${color}.bol{${PLAIN_DONE_BAR_CHAR}}`).repeat(\n        percentVal\n      );\n      bgBars = style(`$${bgColor}.dim{${PLAIN_NOT_DONE_BAR_CHAR}}`).repeat(\n        this._options.width - percentVal\n      );\n    } else {\n      const barChar = this._getBarCharBySize(bar.size);\n      doneBars = style(`$${color}.bol{${barChar}}`).repeat(percentVal);\n      bgBars = style(`$${bgColor}.dim{${barChar}}`).repeat(\n        this._options.width - percentVal\n      );\n    }\n\n    return doneBars + bgBars;\n  }\n\n  private _render() {\n    this._bars.forEach((b, i) => {\n      let str = '';\n\n      if (i > 0 && this._options.stream.isTTY) {\n        this._options.stream.write(EOL);\n      }\n\n      const prefix = Object.hasOwn(b, 'prefix')\n        ? b.prefix\n        : this._options.prefix;\n      const suffix = Object.hasOwn(b, 'suffix')\n        ? b.suffix\n        : this._options.suffix;\n      const showPercent = Object.hasOwn(b, 'showPercent')\n        ? b.showPercent\n        : this._options.showPercent;\n      const showCount = Object.hasOwn(b, 'showCount')\n        ? b.showCount\n        : this._options.showCount;\n      const variant = Object.hasOwn(b, 'variant')\n        ? b.variant\n        : this._options.variant;\n\n      const percent = b.total\n        ? Math.trunc(percentage(isNaN(b.value) ? 0 : b.value, b.total))\n        : 0;\n\n      if (b.progress && this._options.stream.isTTY) {\n        const bar = this._getBars(b, percent);\n        str += (\n          intersperse(\n            compact([\n              prefix,\n              variant === 'PLAIN' ? `[${bar}]` : bar,\n              showPercent ? percent + '%' : null,\n              showCount ? `[${b.value || 0}/${b.total || 0}]` : null,\n              suffix,\n            ]),\n            ' '\n          ) as string[]\n        ).join('');\n      } else {\n        str += prefix + ' ' + suffix;\n      }\n\n      if (!this._options.stream.isTTY) {\n        str = (\n          intersperse(\n            compact([\n              '⏳',\n              prefix,\n              showPercent ? percent + '%' : null,\n              showCount ? `[${b.value || 0}/${b.total || 0}]` : null,\n              suffix,\n            ]),\n            ' '\n          ) as string[]\n        ).join('');\n        this._options.stream.write(str + EOL);\n        return;\n      }\n\n      if (\n        this._options.stream.cursorTo(0) &&\n        this._options.stream.clearLine(0)\n      ) {\n        this._options.stream.write(str);\n      }\n    });\n  }\n\n  /** Starts rendering of the progress bars. */\n  start(bar?: Partial<Bar>) {\n    if (isObj(bar)) {\n      this._bars.push({ ...bar, progress: true } as Bar);\n    }\n    this._render();\n  }\n\n  private _clear() {\n    this._options.stream.moveCursor(0, -(this._bars.length - 1));\n    this._options.stream.cursorTo(0);\n    this._options.stream.clearScreenDown();\n  }\n\n  /** Stops the current progress bar with optional message to display. */\n  stop(msg?: string) {\n    if (this._options.autoClear) {\n      this._clear();\n      if (msg) {\n        this._options.stream.write(msg + EOL);\n      }\n      return;\n    }\n    this._options.stream.write(EOL);\n  }\n\n  /** Update the current progress bar */\n  update(bar: Partial<Bar>, id?: number) {\n    if (!id) {\n      this._bars[0] = { ...(this._bars[0] as Bar), ...bar } as Bar;\n    } else {\n      const index = this._bars.findIndex((b) => isObj(b) && b.id === id);\n      this._bars[index] = { ...(this._bars[index] as Bar), ...bar } as Bar;\n    }\n    this._options.stream.moveCursor(0, -(this._bars.length - 1));\n    this._render();\n  }\n\n  /** Adds a new progress bar to the rendering stack. */\n  add(bar: Partial<Bar>) {\n    const id = this._bars.length + 1;\n    const barInstance = { progress: true, ...bar, id } as Bar;\n    this._bars.push(barInstance);\n    if (this._bars.length > 2) {\n      this._options.stream.moveCursor(0, -(this._bars.length - 2));\n    }\n    this._render();\n    return {\n      update: (bar: Partial<Bar>) => {\n        this.update(bar, id);\n      },\n      inc: (bar?: Partial<Bar>, val = 1) => {\n        const curBar = this._bars.find((b) => b.id === id);\n        const n = curBar?.value || 0;\n        this.update({ ...bar, value: n + val }, id);\n      },\n    };\n  }\n\n  /** Increment the value + 1, optionally with the provided value. */\n  inc(bar?: Partial<Bar>, val = 1) {\n    const n = this._bars[0]?.value || 0;\n    this.update({ ...bar, value: n + val });\n  }\n}\n\nexport default ProgressBar;\n","export const DEFAULT_BAR_CHAR = '\\u{2588}';\n\nexport const SMALL_BAR_CHAR = '\\u{2501}';\n\nexport const MEDIUM_BAR_CHAR = '\\u{2586}';\n\nexport const PLAIN_DONE_BAR_CHAR = '=';\n\nexport const PLAIN_NOT_DONE_BAR_CHAR = '-';\n"],"mappings":"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","names":["src_exports","__export","ProgressBar_default","__toCommonJS","import_node_os","import_cli_styles","import_std","DEFAULT_BAR_CHAR","SMALL_BAR_CHAR","MEDIUM_BAR_CHAR","PLAIN_DONE_BAR_CHAR","PLAIN_NOT_DONE_BAR_CHAR","ProgressBar","options","opts","size","SMALL_BAR_CHAR","MEDIUM_BAR_CHAR","DEFAULT_BAR_CHAR","bar","percent","doneBars","bgBars","color","bgColor","percentVal","PLAIN_DONE_BAR_CHAR","PLAIN_NOT_DONE_BAR_CHAR","barChar","b","i","str","prefix","suffix","showPercent","showCount","variant","msg","id","index","barInstance","val","n","ProgressBar_default"]}