{"version":3,"file":"log.cjs","names":["spinnerFrames","log","ANSIColors","v","x"],"sources":["../../../src/loadDictionaries/log.ts"],"sourcesContent":["import { log } from '@intlayer/config/built';\nimport * as ANSIColors from '@intlayer/config/colors';\nimport {\n  colorize,\n  getPrefix,\n  spinnerFrames,\n  v,\n  x,\n} from '@intlayer/config/logger';\nimport { extractErrorMessage } from '@intlayer/config/utils';\nimport type { DictionariesStatus } from './loadDictionaries';\n\nexport class DictionariesLogger {\n  private statuses: DictionariesStatus[] = [];\n  private spinnerTimer: NodeJS.Timeout | null = null;\n  private spinnerIndex = 0;\n  private renderedLines = 0;\n  private readonly spinnerFrames = spinnerFrames;\n  private isFinished = false;\n  private readonly prefix: string;\n  private lastRenderedState: string = '';\n  private remoteCheckInProgress = false;\n  private expectRemote = false;\n  private remoteError: string | undefined;\n  private pluginTotal = 0;\n  private pluginDone = 0;\n  private pluginError: string | undefined;\n\n  constructor() {\n    this.prefix = getPrefix(log?.prefix) ?? '';\n  }\n\n  setExpectRemote(expect: boolean) {\n    this.expectRemote = expect;\n  }\n\n  startRemoteCheck() {\n    if (this.isFinished) return;\n    this.remoteCheckInProgress = true;\n    this.startSpinner();\n    this.render();\n  }\n\n  stopRemoteCheck() {\n    this.remoteCheckInProgress = false;\n  }\n\n  update(newStatuses: DictionariesStatus[]) {\n    if (this.isFinished) return;\n    for (const status of newStatuses) {\n      const index = this.statuses.findIndex(\n        (s) =>\n          s.dictionaryKey === status.dictionaryKey && s.type === status.type\n      );\n      if (index >= 0) {\n        this.statuses[index] = status;\n      } else {\n        this.statuses.push(status);\n      }\n    }\n\n    // If we expect remote fetch later, avoid rendering a local-only line first\n    const { remoteTotal } = this.computeProgress();\n    if (this.expectRemote && !this.remoteCheckInProgress && remoteTotal === 0) {\n      // Do not start spinner or render yet; wait until remote check starts\n      return;\n    }\n\n    this.startSpinner();\n    this.render();\n  }\n\n  finish() {\n    this.isFinished = true;\n    this.stopSpinner();\n    // Render final state and keep it visible\n    this.render();\n  }\n\n  private startSpinner() {\n    if (this.spinnerTimer || this.isFinished) return;\n    this.spinnerTimer = setInterval(() => {\n      this.spinnerIndex = (this.spinnerIndex + 1) % this.spinnerFrames.length;\n      this.render();\n    }, 100);\n  }\n\n  private stopSpinner() {\n    if (!this.spinnerTimer) return;\n    clearInterval(this.spinnerTimer);\n    this.spinnerTimer = null;\n  }\n\n  public setRemoteError = (error?: Error) => {\n    this.remoteError = extractErrorMessage(error);\n    // Avoid rendering a transient remote-only line while the remote check flag is still true\n    // Ensure local + remote are rendered together after a failure\n    this.stopRemoteCheck();\n    this.render();\n  };\n\n  setPluginTotal(total: number) {\n    if (this.isFinished) return;\n    this.pluginTotal = total;\n    if (total > 0) {\n      this.startSpinner();\n    }\n    this.render();\n  }\n\n  setPluginDone(done: number) {\n    if (this.isFinished) return;\n    this.pluginDone = done;\n    this.render();\n  }\n\n  setPluginError(error?: Error) {\n    if (this.isFinished) return;\n    this.pluginError = extractErrorMessage(error);\n    this.render();\n  }\n\n  private render() {\n    const {\n      localTotal,\n      localDone,\n      remoteTotal,\n      remoteDone,\n      pluginTotal,\n      pluginDone,\n    } = this.computeProgress();\n\n    const frame = this.spinnerFrames[this.spinnerIndex];\n    const clock = colorize(frame, ANSIColors.BLUE);\n    const lines: string[] = [];\n\n    const isLocalDone = localDone === localTotal;\n    const isRemoteDone = remoteDone === remoteTotal;\n    const isPluginDone = pluginDone === pluginTotal;\n\n    const suppressLocalWhileCheckingRemote =\n      this.expectRemote && this.remoteCheckInProgress && remoteTotal === 0;\n\n    if (!suppressLocalWhileCheckingRemote) {\n      if (isLocalDone) {\n        lines.push(\n          `${this.prefix} ${v} Local content: ${colorize(`${localDone}`, ANSIColors.GREEN)}${colorize(`/${localTotal}`, ANSIColors.GREY)}`\n        );\n      } else {\n        lines.push(\n          `${this.prefix} ${clock} Local content: ${colorize(`${localDone}`, ANSIColors.BLUE)}${colorize(`/${localTotal}`, ANSIColors.GREY)}`\n        );\n      }\n    }\n\n    // Single remote line: show error, check, or progress counts\n    if (remoteTotal > 0 || this.remoteCheckInProgress || this.remoteError) {\n      if (this.remoteError) {\n        lines.push(\n          `${this.prefix} ${x} Remote content: ${colorize(\n            this.remoteError,\n            ANSIColors.RED\n          )}`\n        );\n      } else if (remoteTotal === 0) {\n        lines.push(\n          `${this.prefix} ${clock} Remote content: ${colorize('Check server', ANSIColors.BLUE)}`\n        );\n      } else if (isRemoteDone) {\n        lines.push(\n          `${this.prefix} ${v} Remote content: ${colorize(`${remoteDone}`, ANSIColors.GREEN)}${colorize(`/${remoteTotal}`, ANSIColors.GREY)}`\n        );\n      } else {\n        lines.push(\n          `${this.prefix} ${clock} Remote content: ${colorize(`${remoteDone}`, ANSIColors.BLUE)}${colorize(`/${remoteTotal}`, ANSIColors.GREY)}`\n        );\n      }\n    }\n\n    // Plugin line: show error or progress counts\n    if (pluginTotal > 0 || this.pluginError) {\n      if (this.pluginError) {\n        lines.push(\n          `${this.prefix} ${x} Plugin content: ${colorize(\n            this.pluginError,\n            ANSIColors.RED\n          )}`\n        );\n      } else if (isPluginDone) {\n        lines.push(\n          `${this.prefix} ${v} Plugin content: ${colorize(`${pluginDone}`, ANSIColors.GREEN)}${colorize(`/${pluginTotal}`, ANSIColors.GREY)}`\n        );\n      } else {\n        lines.push(\n          `${this.prefix} ${clock} Plugin content: ${colorize(`${pluginDone}`, ANSIColors.BLUE)}${colorize(`/${pluginTotal}`, ANSIColors.GREY)}`\n        );\n      }\n    }\n\n    // Check if the state has changed to avoid duplicate rendering\n    const currentState = lines.join('\\n');\n    if (currentState === this.lastRenderedState) {\n      return;\n    }\n    this.lastRenderedState = currentState;\n\n    if (this.renderedLines > 0) {\n      process.stdout.write(`\\x1b[${this.renderedLines}F`);\n    }\n\n    const totalLinesToClear = Math.max(this.renderedLines, lines.length);\n    for (let i = 0; i < totalLinesToClear; i++) {\n      process.stdout.write('\\x1b[2K');\n      const line = lines[i];\n      if (line !== undefined) {\n        process.stdout.write(line);\n      }\n      process.stdout.write('\\n');\n    }\n\n    this.renderedLines = lines.length;\n  }\n\n  private computeProgress() {\n    const localKeys = new Set(\n      this.statuses\n        .filter((s) => s.type === 'local')\n        .map((s) => s.dictionaryKey)\n    );\n\n    const localDoneKeys = new Set(\n      this.statuses\n        .filter(\n          (s) =>\n            s.type === 'local' && (s.status === 'built' || s.status === 'error')\n        )\n        .map((s) => s.dictionaryKey)\n    );\n\n    const remoteKeys = new Set(\n      this.statuses\n        .filter((s) => s.type === 'remote')\n        .map((s) => s.dictionaryKey)\n    );\n\n    const remoteDoneKeys = new Set(\n      this.statuses\n        .filter(\n          (s) =>\n            s.type === 'remote' &&\n            (s.status === 'fetched' ||\n              s.status === 'imported' ||\n              s.status === 'error')\n        )\n        .map((s) => s.dictionaryKey)\n    );\n\n    return {\n      localTotal: localKeys.size,\n      localDone: localDoneKeys.size,\n      remoteTotal: remoteKeys.size,\n      remoteDone: remoteDoneKeys.size,\n      pluginTotal: this.pluginTotal,\n      pluginDone: this.pluginDone,\n    } as const;\n  }\n}\n"],"mappings":"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"}