repomix
Version:
A tool to pack repository contents to single file for AI consumption
68 lines (67 loc) • 3.05 kB
JavaScript
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.');
}
}
};