{
  "version": 3,
  "sources": ["../../../../../src/packages/default-reporter/reporterForClient/reportLifecycleScripts.ts"],
  "sourcesContent": ["import cliTruncate from 'cli-truncate';\nimport path from 'node:path';\nimport type { LifecycleLog } from '../../core-loggers/index.ts';\nimport * as Rx from 'rxjs';\nimport {\n  buffer,\n  filter,\n  groupBy,\n  map,\n  mergeAll,\n  mergeMap,\n} from 'rxjs/operators';\nimport chalk from 'chalk';\nimport prettyTime from 'pretty-ms';\nimport { EOL } from '../constants.ts';\nimport { formatPrefix, formatPrefixNoTrim } from './utils/formatPrefix.ts';\nimport { hlValue } from './outputConstants.ts';\n\nconst NODE_MODULES = `${path.sep}node_modules${path.sep}`;\nconst TMP_DIR_IN_STORE = `tmp${path.sep}_tmp_`; // git-hosted dependencies are built in these temporary directories\n\nconst ANSI_ESCAPES_LENGTH_OF_PREFIX = hlValue(' ').length - 1;\n\n// When streaming processes are spawned, use this color for prefix\nconst colorWheel = [\n  'cyan',\n  'magenta',\n  'blue',\n  'yellow',\n  'green',\n  'red',\n] as const;\nconst NUM_COLORS = colorWheel.length;\n\n// Ever-increasing index ensures colors are always sequential\nlet currentColor = 0;\n\ntype ColorByPkg = Map<string, (txt: string) => string>;\n\nexport function reportLifecycleScripts(\n  log$: {\n    lifecycle: Rx.Observable<LifecycleLog>;\n  },\n  opts: {\n    appendOnly?: boolean | undefined;\n    aggregateOutput?: boolean | undefined;\n    hideLifecyclePrefix?: boolean | undefined;\n    cwd: string;\n    width: number;\n  }\n): Rx.Observable<Rx.Observable<{ msg: string }>> {\n  // When the reporter is not append-only, the length of output is limited\n  // in order to reduce flickering\n  if (opts.appendOnly === true) {\n    let lifecycle$ = log$.lifecycle;\n    if (opts.aggregateOutput === true) {\n      lifecycle$ = lifecycle$.pipe(aggregateOutput);\n    }\n\n    const streamLifecycleOutput = createStreamLifecycleOutput(\n      opts.cwd,\n      opts.hideLifecyclePrefix === true\n    );\n    return lifecycle$.pipe(\n      map((log: LifecycleLog) => {\n        return Rx.of({\n          msg: streamLifecycleOutput(log),\n        });\n      })\n    );\n  }\n  const lifecycleMessages: {\n    [depPath: string]: {\n      collapsed: boolean;\n      output: string[];\n      script: string;\n      startTime: [number, number];\n      status: string;\n    };\n  } = {};\n  const lifecycleStreamByDepPath: {\n    [depPath: string]: Rx.Subject<{ msg: string }>;\n  } = {};\n\n  const lifecyclePushStream = new Rx.Subject<Rx.Observable<{ msg: string }>>();\n\n  // TODO: handle promise of .forEach?!\n  // biome-ignore lint/complexity/noForEach: <explanation>\n  log$.lifecycle.forEach((log: LifecycleLog) => {\n    const key = `${log.stage}:${log.depPath}`;\n\n    lifecycleMessages[key] = lifecycleMessages[key] ?? {\n      collapsed:\n        log.wd.includes(NODE_MODULES) || log.wd.includes(TMP_DIR_IN_STORE),\n      output: [],\n      script: '',\n      startTime: process.hrtime(),\n      status: formatIndentedStatus(chalk.magentaBright('Running...')),\n    };\n\n    const exit = typeof log.exitCode === 'number';\n\n    let msg: string;\n\n    if (lifecycleMessages[key].collapsed) {\n      msg = renderCollapsedScriptOutput(log, lifecycleMessages[key], {\n        cwd: opts.cwd,\n        exit,\n        maxWidth: opts.width,\n      });\n    } else {\n      msg = renderScriptOutput(log, lifecycleMessages[key], {\n        cwd: opts.cwd,\n        exit,\n        maxWidth: opts.width,\n      });\n    }\n\n    if (exit) {\n      delete lifecycleMessages[key];\n    }\n\n    if (!lifecycleStreamByDepPath[key]) {\n      lifecycleStreamByDepPath[key] = new Rx.Subject<{ msg: string }>();\n      lifecyclePushStream.next(Rx.from(lifecycleStreamByDepPath[key]));\n    }\n\n    lifecycleStreamByDepPath[key].next({ msg });\n\n    if (exit) {\n      lifecycleStreamByDepPath[key].complete();\n    }\n  });\n\n  return Rx.from(lifecyclePushStream);\n}\n\nfunction toNano(time: [number, number]): number {\n  return (time[0] + time[1] / 1e9) * 1e3;\n}\n\nfunction renderCollapsedScriptOutput(\n  log: LifecycleLog,\n  messageCache: {\n    collapsed: boolean;\n    label?: string;\n    output: string[];\n    script: string;\n    startTime: [number, number];\n    status: string;\n  },\n  opts: {\n    cwd: string;\n    exit: boolean;\n    maxWidth: number;\n  }\n): string {\n  if (typeof messageCache.label === 'undefined') {\n    messageCache.label = highlightLastFolder(\n      formatPrefixNoTrim(opts.cwd, log.wd)\n    );\n\n    if (log.wd.includes(TMP_DIR_IN_STORE) === true) {\n      messageCache.label += ` [${log.depPath}]`;\n    }\n\n    messageCache.label += `: Running ${log.stage} script`;\n  }\n\n  if (!opts.exit) {\n    updateMessageCache(log, messageCache, opts);\n    return `${messageCache.label}...`;\n  }\n\n  const time = prettyTime(toNano(process.hrtime(messageCache.startTime)));\n\n  if (log.exitCode === 0) {\n    return `${messageCache.label}, done in ${time}`;\n  }\n\n  if (log.optional === true) {\n    return `${messageCache.label}, failed in ${time} (skipped as optional)`;\n  }\n\n  return `${messageCache.label}, failed in ${time}${EOL}${renderScriptOutput(log, messageCache, opts)}`;\n}\n\nfunction renderScriptOutput(\n  log: LifecycleLog,\n  messageCache: {\n    collapsed: boolean;\n    output: string[];\n    script: string;\n    startTime: [number, number];\n    status: string;\n  },\n  opts: {\n    cwd: string;\n    exit: boolean;\n    maxWidth: number;\n  }\n): string {\n  updateMessageCache(log, messageCache, opts);\n  if (opts.exit && log.exitCode !== 0) {\n    return [\n      messageCache.script,\n      ...messageCache.output,\n      messageCache.status,\n    ].join(EOL);\n  }\n\n  if (messageCache.output.length > 10) {\n    return [\n      messageCache.script,\n      `[${messageCache.output.length - 10} lines collapsed]`,\n      ...messageCache.output.slice(messageCache.output.length - 10),\n      messageCache.status,\n    ].join(EOL);\n  }\n\n  return [\n    messageCache.script,\n    ...messageCache.output,\n    messageCache.status,\n  ].join(EOL);\n}\n\nfunction updateMessageCache(\n  log: LifecycleLog,\n  messageCache: {\n    collapsed: boolean;\n    output: string[];\n    script: string;\n    startTime: [number, number];\n    status: string;\n  },\n  opts: {\n    cwd: string;\n    exit: boolean;\n    maxWidth: number;\n  }\n): void {\n  if (typeof log.script === 'string' && log.script !== '') {\n    const prefix = `${formatPrefix(opts.cwd, log.wd)} ${hlValue(log.stage)}`;\n    const maxLineWidth =\n      opts.maxWidth - prefix.length - 2 + ANSI_ESCAPES_LENGTH_OF_PREFIX;\n    messageCache.script = `${prefix}$ ${cutLine(log.script, maxLineWidth)}`;\n  } else if (opts.exit) {\n    const time = prettyTime(toNano(process.hrtime(messageCache.startTime)));\n    if (log.exitCode === 0) {\n      messageCache.status = formatIndentedStatus(\n        chalk.magentaBright(`Done in ${time}`)\n      );\n    } else {\n      messageCache.status = formatIndentedStatus(\n        chalk.red(`Failed in ${time} at ${log.wd}`)\n      );\n    }\n  } else {\n    messageCache.output.push(formatIndentedOutput(opts.maxWidth, log));\n  }\n}\n\nfunction formatIndentedStatus(status: string): string {\n  return `${chalk.magentaBright('\u2514\u2500')} ${status}`;\n}\n\nfunction highlightLastFolder(p: string): string {\n  const lastSlash = p.lastIndexOf('/') + 1;\n  return `${chalk.gray(p.slice(0, lastSlash))}${p.slice(lastSlash)}`;\n}\n\nfunction createStreamLifecycleOutput(\n  cwd: string,\n  hideLifecyclePrefix: boolean\n): (logObj: LifecycleLog) => string {\n  currentColor = 0;\n  const colorByPrefix: ColorByPkg = new Map();\n  return streamLifecycleOutput.bind(\n    null,\n    colorByPrefix,\n    cwd,\n    hideLifecyclePrefix\n  );\n}\n\nfunction streamLifecycleOutput(\n  colorByPkg: ColorByPkg,\n  cwd: string,\n  hideLifecyclePrefix: boolean,\n  logObj: LifecycleLog\n): string {\n  const prefix = formatLifecycleScriptPrefix(\n    colorByPkg,\n    cwd,\n    logObj.wd,\n    logObj.stage\n  );\n  if (typeof logObj.exitCode === 'number') {\n    return logObj.exitCode === 0 ? `${prefix}: Done` : `${prefix}: Failed`;\n  }\n\n  if (typeof logObj.script === 'string') {\n    return `${prefix}$ ${logObj.script}`;\n  }\n  const line = formatLine(Number.POSITIVE_INFINITY, logObj);\n  return hideLifecyclePrefix ? line : `${prefix}: ${line}`;\n}\n\nfunction formatIndentedOutput(maxWidth: number, logObj: LifecycleLog): string {\n  return `${chalk.magentaBright('\u2502')} ${formatLine(maxWidth - 2, logObj)}`;\n}\n\nfunction formatLifecycleScriptPrefix(\n  colorByPkg: ColorByPkg,\n  cwd: string,\n  wd: string,\n  stage: string\n): string {\n  if (!colorByPkg.has(wd)) {\n    const colorName = colorWheel[currentColor % NUM_COLORS];\n\n    if (typeof colorName === 'string') {\n      colorByPkg.set(wd, chalk[colorName]);\n\n      currentColor++;\n    }\n  }\n\n  const color = colorByPkg.get(wd);\n\n  if (typeof color === 'function') {\n    return `${color(formatPrefix(cwd, wd))} ${hlValue(stage)}`;\n  }\n\n  return `${formatPrefix(cwd, wd)} ${hlValue(stage)}`;\n}\n\nfunction formatLine(maxWidth: number, logObj: LifecycleLog): string {\n  const line = cutLine(logObj.line, maxWidth);\n\n  // TODO: strip only the non-color/style ansi escape codes\n  if (logObj.stdio === 'stderr') {\n    return chalk.gray(line);\n  }\n\n  return line;\n}\n\nfunction cutLine(line: string | undefined, maxLength: number): string {\n  if (typeof line === 'undefined' || line === '') return '';\n  return cliTruncate(line, maxLength);\n}\n\nfunction aggregateOutput(\n  source: Rx.Observable<LifecycleLog>\n): Rx.Observable<LifecycleLog> {\n  return source.pipe(\n    // The '\\0' is a null character which delimits these strings. This works since JS doesn't use\n    // null-terminated strings.\n    groupBy((data) => `${data.depPath}\\0${data.stage}`),\n    mergeMap((group) => {\n      return group.pipe(buffer(group.pipe(filter((msg) => 'exitCode' in msg))));\n    }),\n    map((ar) => Rx.from(ar)),\n    mergeAll()\n  );\n}\n"],
  "mappings": "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",
  "names": ["streamLifecycleOutput"]
}
