repomix
Version:
A tool to pack repository contents to single file for AI consumption
65 lines (64 loc) • 3.31 kB
JavaScript
import { withMemoryLogging } from '../../shared/memoryUtils.js';
import { generateOutput as generateOutputDefault } from '../output/outputGenerate.js';
import { generateSplitOutputParts } from '../output/outputSplit.js';
import { copyToClipboardIfEnabled as copyToClipboardIfEnabledDefault } from './copyToClipboardIfEnabled.js';
import { writeOutputToDisk as writeOutputToDiskDefault } from './writeOutputToDisk.js';
const defaultDeps = {
generateOutput: generateOutputDefault,
writeOutputToDisk: writeOutputToDiskDefault,
copyToClipboardIfEnabled: copyToClipboardIfEnabledDefault,
};
export const produceOutput = async (rootDirs, config, processedFiles, allFilePaths, gitDiffResult, gitLogResult, progressCallback, filePathsByRoot, emptyDirPaths, overrideDeps = {}) => {
const deps = { ...defaultDeps, ...overrideDeps };
const splitMaxBytes = config.output.splitOutput;
if (splitMaxBytes !== undefined) {
return await generateAndWriteSplitOutput(rootDirs, config, processedFiles, allFilePaths, splitMaxBytes, gitDiffResult, gitLogResult, progressCallback, filePathsByRoot, emptyDirPaths, deps);
}
return await generateAndWriteSingleOutput(rootDirs, config, processedFiles, allFilePaths, gitDiffResult, gitLogResult, progressCallback, filePathsByRoot, emptyDirPaths, deps);
};
const generateAndWriteSplitOutput = async (rootDirs, config, processedFiles, allFilePaths, splitMaxBytes, gitDiffResult, gitLogResult, progressCallback, filePathsByRoot, emptyDirPaths, deps) => {
const parts = await withMemoryLogging('Generate Split Output', async () => {
return await generateSplitOutputParts({
rootDirs,
baseConfig: config,
processedFiles,
allFilePaths,
maxBytesPerPart: splitMaxBytes,
gitDiffResult,
gitLogResult,
progressCallback,
filePathsByRoot,
emptyDirPaths,
deps: {
generateOutput: deps.generateOutput,
},
});
});
progressCallback('Writing output files...');
await withMemoryLogging('Write Split Output', async () => {
await Promise.all(parts.map((part) => {
const partConfig = {
...config,
output: {
...config.output,
stdout: false,
filePath: part.filePath,
},
};
return deps.writeOutputToDisk(part.content, partConfig);
}));
});
return {
outputFiles: parts.map((p) => p.filePath),
outputForMetrics: parts.map((p) => p.content),
};
};
const generateAndWriteSingleOutput = async (rootDirs, config, processedFiles, allFilePaths, gitDiffResult, gitLogResult, progressCallback, filePathsByRoot, emptyDirPaths, deps) => {
const output = await withMemoryLogging('Generate Output', () => deps.generateOutput(rootDirs, config, processedFiles, allFilePaths, gitDiffResult, gitLogResult, filePathsByRoot, emptyDirPaths));
progressCallback('Writing output file...');
await withMemoryLogging('Write Output', () => deps.writeOutputToDisk(output, config));
await deps.copyToClipboardIfEnabled(output, progressCallback, config);
return {
outputForMetrics: output,
};
};