git-contributor-stats
Version:
CLI to compute contributor and repository statistics from a Git repository (commits, lines added/deleted, frequency, heatmap, bus-factor), with filters and multiple output formats.
1 lines • 3.43 kB
Source Map (JSON)
{"version":3,"file":"output.mjs","sources":["../../src/features/output.ts"],"sourcesContent":["// Feature: Console output formatting\r\n// Handles table, CSV, and JSON output to stdout\r\n\r\nimport type { ContributorBasic } from '../analytics/aggregator.ts';\r\nimport { printCSV, printTable } from '../analytics/aggregator.ts';\r\nimport {\r\n formatTopStatsLines,\r\n parseTopStatsMetrics,\r\n type TopStatsEntry\r\n} from '../utils/formatting.ts';\r\nimport type { ContributorStatsResult } from './stats.ts';\r\n\r\nexport interface OutputOptions {\r\n json?: boolean;\r\n format?: string;\r\n topStats?: string;\r\n labelBy?: 'email' | 'name';\r\n}\r\n\r\nexport function handleStdoutOutput(final: ContributorStatsResult, opts: OutputOptions = {}): void {\r\n const stdoutWantsJSON = opts.json || String(opts.format || '').toLowerCase() === 'json';\r\n const stdoutWantsCSV = String(opts.format || '').toLowerCase() === 'csv';\r\n const labelBy: 'email' | 'name' = final.basic?.labelBy || opts.labelBy || 'name';\r\n\r\n if (stdoutWantsJSON) {\r\n console.log(JSON.stringify(final, null, 2));\r\n return;\r\n }\r\n\r\n const csvContributors: ContributorBasic[] = final.topContributors.map((tc) => ({\r\n key: tc.email ?? tc.name ?? '',\r\n name: tc.name ?? '',\r\n emails: tc.email ? [tc.email] : [],\r\n commits: tc.commits,\r\n additions: tc.added,\r\n deletions: tc.deleted,\r\n changes: tc.changes,\r\n firstCommitDate: undefined,\r\n lastCommitDate: undefined\r\n }));\r\n\r\n if (stdoutWantsCSV) {\r\n printCSV(csvContributors, labelBy);\r\n return;\r\n }\r\n\r\n if (opts.topStats && opts.topStats.length > 0) {\r\n console.log('Top stats:');\r\n const topStatsMetrics = parseTopStatsMetrics(opts.topStats);\r\n const topStatsRecord: Record<string, TopStatsEntry> = {};\r\n if (final.topStats) {\r\n for (const key of Object.keys(final.topStats) as Array<keyof typeof final.topStats>) {\r\n const value = final.topStats[key];\r\n if (value) {\r\n topStatsRecord[key] = value;\r\n }\r\n }\r\n }\r\n for (const l of formatTopStatsLines(topStatsRecord, topStatsMetrics)) {\r\n console.log(`- ${l}`);\r\n }\r\n console.log('');\r\n }\r\n\r\n printTable(csvContributors, final.basic.meta, labelBy);\r\n}\r\n"],"names":[],"mappings":";;;;AAmBO,SAAS,mBAAmB,OAA+B,OAAsB,IAAU;AAChG,QAAM,kBAAkB,KAAK,QAAQ,OAAO,KAAK,UAAU,EAAE,EAAE,YAAA,MAAkB;AACjF,QAAM,iBAAiB,OAAO,KAAK,UAAU,EAAE,EAAE,kBAAkB;AACnE,QAAM,UAA4B,MAAM,OAAO,WAAW,KAAK,WAAW;AAE1E,MAAI,iBAAiB;AACnB,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,EACF;AAEA,QAAM,kBAAsC,MAAM,gBAAgB,IAAI,CAAC,QAAQ;AAAA,IAC7E,KAAK,GAAG,SAAS,GAAG,QAAQ;AAAA,IAC5B,MAAM,GAAG,QAAQ;AAAA,IACjB,QAAQ,GAAG,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAA;AAAA,IAChC,SAAS,GAAG;AAAA,IACZ,WAAW,GAAG;AAAA,IACd,WAAW,GAAG;AAAA,IACd,SAAS,GAAG;AAAA,IACZ,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAAA,EAChB;AAEF,MAAI,gBAAgB;AAClB,aAAS,iBAAiB,OAAO;AACjC;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,YAAQ,IAAI,YAAY;AACxB,UAAM,kBAAkB,qBAAqB,KAAK,QAAQ;AAC1D,UAAM,iBAAgD,CAAA;AACtD,QAAI,MAAM,UAAU;AAClB,iBAAW,OAAO,OAAO,KAAK,MAAM,QAAQ,GAAyC;AACnF,cAAM,QAAQ,MAAM,SAAS,GAAG;AAChC,YAAI,OAAO;AACT,yBAAe,GAAG,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,oBAAoB,gBAAgB,eAAe,GAAG;AACpE,cAAQ,IAAI,KAAK,CAAC,EAAE;AAAA,IACtB;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,aAAW,iBAAiB,MAAM,MAAM,MAAM,OAAO;AACvD;"}