UNPKG

repomix

Version:

A tool to pack repository contents to single file for AI consumption

68 lines (67 loc) 3.05 kB
import pc from 'picocolors'; import { buildTokenCountTree, } from '../../core/tokenCount/buildTokenCountStructure.js'; import { logger } from '../../shared/logger.js'; export const reportTokenCountTree = (processedFiles, fileTokenCounts, config) => { const minTokenCount = typeof config.output.tokenCountTree === 'number' ? config.output.tokenCountTree : 0; const filesWithTokens = []; for (const file of processedFiles) { const tokens = fileTokenCounts[file.path]; if (tokens !== undefined) { filesWithTokens.push({ path: file.path, tokens, }); } } logger.log('🔢 Token Count Tree:'); logger.log(pc.dim('────────────────────')); if (minTokenCount > 0) { logger.log(`Showing entries with ${minTokenCount}+ tokens:`); } const tree = buildTokenCountTree(filesWithTokens); displayNode(tree, '', true, minTokenCount); }; const displayNode = (node, prefix, isRoot, minTokenCount) => { const allEntries = Object.entries(node).filter(([key, value]) => !key.startsWith('_') && value && typeof value === 'object' && !Array.isArray(value)); const entries = allEntries.filter(([, value]) => { const tokenSum = value._tokenSum || 0; return tokenSum >= minTokenCount; }); const allFiles = node._files || []; const files = allFiles.filter((file) => file.tokens >= minTokenCount); entries.sort(([a], [b]) => a.localeCompare(b)); files.sort((a, b) => a.name.localeCompare(b.name)); files.forEach((file, index) => { const isLastFile = index === files.length - 1 && entries.length === 0; const connector = isLastFile ? '└── ' : '├── '; const tokenInfo = pc.dim(`(${file.tokens.toLocaleString()} tokens)`); if (isRoot && prefix === '') { logger.log(`${connector}${file.name} ${tokenInfo}`); } else { logger.log(`${prefix}${connector}${file.name} ${tokenInfo}`); } }); entries.forEach(([name, childNode], index) => { const isLastEntry = index === entries.length - 1; const connector = isLastEntry ? '└── ' : '├── '; const tokenSum = childNode._tokenSum || 0; const tokenInfo = pc.dim(`(${tokenSum.toLocaleString()} tokens)`); if (isRoot && prefix === '') { logger.log(`${connector}${name}/ ${tokenInfo}`); } else { logger.log(`${prefix}${connector}${name}/ ${tokenInfo}`); } const childPrefix = isRoot && prefix === '' ? (isLastEntry ? ' ' : '│ ') : prefix + (isLastEntry ? ' ' : '│ '); displayNode(childNode, childPrefix, false, minTokenCount); }); if (isRoot && files.length === 0 && entries.length === 0) { if (minTokenCount > 0) { logger.log(`No files or directories found with ${minTokenCount}+ tokens.`); } else { logger.log('No files found.'); } } };