{
  "version": 3,
  "sources": ["../../../../../src/packages/default-reporter/reporterForClient/reportStats.ts"],
  "sourcesContent": ["import type { StatsLog } from '../../core-loggers/index.ts';\nimport * as Rx from 'rxjs';\nimport { filter, take, reduce, map } from 'rxjs/operators';\nimport chalk from 'chalk';\nimport repeat from 'ramda/src/repeat';\nimport stringLength from 'string-length';\nimport { EOL } from '../constants.ts';\nimport { ADDED_CHAR, REMOVED_CHAR } from './outputConstants.ts';\nimport { zoomOut } from './utils/zooming.ts';\n\nexport function reportStats(\n  log$: {\n    stats: Rx.Observable<StatsLog>;\n  },\n  opts: {\n    cmd: string;\n    cwd: string;\n    isRecursive: boolean;\n    width: number;\n    hideProgressPrefix?: boolean | undefined;\n  }\n): Array<Rx.Observable<Rx.Observable<{ msg: string }>>> {\n  if (opts.hideProgressPrefix === true) {\n    return [\n      statsForCurrentPackage(log$.stats, {\n        cmd: opts.cmd,\n        width: opts.width,\n      }),\n    ];\n  }\n  const stats$ = opts.isRecursive\n    ? log$.stats\n    : log$.stats.pipe(filter((log) => log.prefix !== opts.cwd));\n\n  const outputs = [\n    statsForNotCurrentPackage(stats$, {\n      cmd: opts.cmd,\n      currentPrefix: opts.cwd,\n      width: opts.width,\n    }),\n  ];\n\n  if (!opts.isRecursive) {\n    outputs.push(\n      statsForCurrentPackage(\n        log$.stats.pipe(filter((log) => log.prefix === opts.cwd)),\n        {\n          cmd: opts.cmd,\n          width: opts.width,\n        }\n      )\n    );\n  }\n\n  return outputs;\n}\n\nfunction statsForCurrentPackage(\n  stats$: Rx.Observable<StatsLog>,\n  opts: {\n    cmd: string;\n    width: number;\n  }\n): Rx.Observable<Rx.Observable<{ msg: string }>> {\n  return stats$.pipe(\n    take(\n      opts.cmd === 'install' ||\n        opts.cmd === 'install-test' ||\n        opts.cmd === 'add' ||\n        opts.cmd === 'update' ||\n        opts.cmd === 'dlx'\n        ? 2\n        : 1\n    ),\n    reduce(\n      (acc, log) => {\n        if (typeof log['added'] === 'number') {\n          acc['added'] = log['added'];\n        } else if (typeof log['removed'] === 'number') {\n          acc['removed'] = log['removed'];\n        }\n        return acc;\n      },\n      {} as { added?: number; removed?: number }\n    ),\n    map((stats) => {\n      // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n      if (!stats['removed'] && !stats['added']) {\n        if (opts.cmd === 'link') {\n          return Rx.NEVER;\n        }\n        return Rx.of({ msg: 'Already up to date' });\n      }\n\n      let msg = 'Packages:';\n      // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n      if (stats['added']) {\n        msg += ` ${chalk.green(`+${stats['added'].toString()}`)}`;\n      }\n      // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n      if (stats['removed']) {\n        msg += ` ${chalk.red(`-${stats['removed'].toString()}`)}`;\n      }\n      msg +=\n        EOL +\n        printPlusesAndMinuses(\n          opts.width,\n          stats['added'] ?? 0,\n          stats['removed'] ?? 0\n        );\n      return Rx.of({ msg });\n    })\n  );\n}\n\nfunction statsForNotCurrentPackage(\n  stats$: Rx.Observable<StatsLog>,\n  opts: {\n    cmd: string;\n    currentPrefix: string;\n    width: number;\n  }\n): Rx.Observable<Rx.Observable<{ msg: string }>> {\n  const stats: Record<string, StatsLog> = {};\n  type CookedStats =\n    | {\n        prefix: string;\n        added?: number | undefined;\n        removed?: number | undefined;\n      }\n    | {\n        seed: typeof stats;\n        value: null;\n        prefix?: never | undefined;\n        added?: never | undefined;\n        removed?: never | undefined;\n      };\n  const cookedStats$ =\n    opts.cmd === 'remove'\n      ? stats$\n      : stats$.pipe(\n          map((log: StatsLog): CookedStats => {\n            // As of pnpm v2.9.0, during `pnpm recursive link`, logging of removed stats happens twice\n            //  1. during linking\n            //  2. during installing\n            // Hence, the stats are added before reported\n            const { prefix } = log;\n\n            if (!stats[prefix]) {\n              stats[prefix] = log;\n\n              return { seed: stats, value: null };\n            }\n\n            if (\n              typeof stats[prefix].added === 'number' &&\n              typeof log['added'] === 'number'\n            ) {\n              stats[prefix].added += log['added'];\n\n              return { seed: stats, value: null };\n            }\n\n            if (\n              typeof stats[prefix].removed === 'number' &&\n              typeof log['removed'] === 'number'\n            ) {\n              stats[prefix].removed += log['removed'];\n\n              return { seed: stats, value: null };\n            }\n\n            const value = { ...stats[prefix], ...log };\n\n            delete stats[prefix];\n\n            return value;\n          }, {})\n        );\n\n  return cookedStats$.pipe(\n    filter(\n      (stats) =>\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        stats !== null &&\n        (typeof stats.removed === 'number' || typeof stats.added === 'number')\n    ),\n    map((stats) => {\n      const parts: string[] = [];\n\n      if (typeof stats.added === 'number') {\n        parts.push(padStep(chalk.green(`+${stats['added'].toString()}`), 4));\n      }\n\n      if (typeof stats.removed === 'number') {\n        parts.push(padStep(chalk.red(`-${stats['removed'].toString()}`), 4));\n      }\n\n      let msg = zoomOut(\n        opts.currentPrefix,\n        stats.prefix ?? '',\n        parts.join(' ')\n      );\n\n      const rest = Math.max(0, opts.width - 1 - stringLength(msg));\n\n      msg += ` ${printPlusesAndMinuses(\n        rest,\n        roundStats(stats.added ?? 0),\n        roundStats(stats.removed ?? 0)\n      )}`;\n      return Rx.of({ msg });\n    })\n  );\n}\n\nfunction padStep(s: string, step: number): string {\n  const sLength = stringLength(s);\n  const placeholderLength = Math.ceil(sLength / step) * step;\n  if (sLength < placeholderLength) {\n    return repeat.default(' ', placeholderLength - sLength).join('') + s;\n  }\n  return s;\n}\n\nfunction roundStats(stat: number): number {\n  if (stat === 0) return 0;\n  return Math.max(1, Math.round(stat / 10));\n}\n\nfunction printPlusesAndMinuses(\n  maxWidth: number,\n  added: number,\n  removed: number\n): string {\n  if (maxWidth === 0) return '';\n  const changes = added + removed;\n  let addedChars: number;\n  let removedChars: number;\n  if (changes > maxWidth) {\n    if (!added) {\n      addedChars = 0;\n      removedChars = maxWidth;\n    } else if (!removed) {\n      addedChars = maxWidth;\n      removedChars = 0;\n    } else {\n      const p = maxWidth / changes;\n      addedChars = Math.min(Math.max(Math.floor(added * p), 1), maxWidth - 1);\n      removedChars = maxWidth - addedChars;\n    }\n  } else {\n    addedChars = added;\n    removedChars = removed;\n  }\n  return `${repeat.default(ADDED_CHAR, addedChars).join('')}${repeat.default(REMOVED_CHAR, removedChars).join('')}`;\n}\n"],
  "mappings": "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",
  "names": ["stats"]
}
