repomix
Version:
A tool to pack repository contents to single file for AI consumption
131 lines (130 loc) • 5.52 kB
JavaScript
import * as v from 'valibot';
import { TOKEN_ENCODINGS } from '../core/metrics/tokenEncodings.js';
export const repomixOutputStyleSchema = v.picklist(['xml', 'markdown', 'json', 'plain']);
export const defaultFilePathMap = {
xml: 'repomix-output.xml',
markdown: 'repomix-output.md',
plain: 'repomix-output.txt',
json: 'repomix-output.json',
};
export const repomixConfigBaseSchema = v.object({
$schema: v.optional(v.string()),
input: v.optional(v.object({
maxFileSize: v.optional(v.number()),
})),
output: v.optional(v.object({
filePath: v.optional(v.string()),
style: v.optional(repomixOutputStyleSchema),
parsableStyle: v.optional(v.boolean()),
headerText: v.optional(v.string()),
instructionFilePath: v.optional(v.string()),
fileSummary: v.optional(v.boolean()),
directoryStructure: v.optional(v.boolean()),
files: v.optional(v.boolean()),
removeComments: v.optional(v.boolean()),
removeEmptyLines: v.optional(v.boolean()),
compress: v.optional(v.boolean()),
topFilesLength: v.optional(v.number()),
showLineNumbers: v.optional(v.boolean()),
truncateBase64: v.optional(v.boolean()),
copyToClipboard: v.optional(v.boolean()),
includeEmptyDirectories: v.optional(v.boolean()),
includeFullDirectoryStructure: v.optional(v.boolean()),
splitOutput: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(Number.MAX_SAFE_INTEGER))),
tokenCountTree: v.optional(v.union([v.boolean(), v.number(), v.string()])),
git: v.optional(v.object({
sortByChanges: v.optional(v.boolean()),
sortByChangesMaxCommits: v.optional(v.number()),
includeDiffs: v.optional(v.boolean()),
includeLogs: v.optional(v.boolean()),
includeLogsCount: v.optional(v.number()),
})),
})),
include: v.optional(v.array(v.string())),
ignore: v.optional(v.object({
useGitignore: v.optional(v.boolean()),
useDotIgnore: v.optional(v.boolean()),
useDefaultPatterns: v.optional(v.boolean()),
customPatterns: v.optional(v.array(v.string())),
})),
security: v.optional(v.object({
enableSecurityCheck: v.optional(v.boolean()),
})),
tokenCount: v.optional(v.object({
encoding: v.optional(v.string()),
})),
});
export const repomixConfigDefaultSchema = v.object({
input: v.object({
maxFileSize: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 50 * 1024 * 1024),
}),
output: v.object({
filePath: v.optional(v.string(), defaultFilePathMap.xml),
style: v.optional(repomixOutputStyleSchema, 'xml'),
parsableStyle: v.optional(v.boolean(), false),
headerText: v.optional(v.string()),
instructionFilePath: v.optional(v.string()),
fileSummary: v.optional(v.boolean(), true),
directoryStructure: v.optional(v.boolean(), true),
files: v.optional(v.boolean(), true),
removeComments: v.optional(v.boolean(), false),
removeEmptyLines: v.optional(v.boolean(), false),
compress: v.optional(v.boolean(), false),
topFilesLength: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0)), 5),
showLineNumbers: v.optional(v.boolean(), false),
truncateBase64: v.optional(v.boolean(), false),
copyToClipboard: v.optional(v.boolean(), false),
includeEmptyDirectories: v.optional(v.boolean()),
includeFullDirectoryStructure: v.optional(v.boolean(), false),
splitOutput: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(Number.MAX_SAFE_INTEGER))),
tokenCountTree: v.optional(v.union([v.boolean(), v.number(), v.string()]), false),
git: v.object({
sortByChanges: v.optional(v.boolean(), true),
sortByChangesMaxCommits: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 100),
includeDiffs: v.optional(v.boolean(), false),
includeLogs: v.optional(v.boolean(), false),
includeLogsCount: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 50),
}),
}),
include: v.optional(v.array(v.string()), () => []),
ignore: v.object({
useGitignore: v.optional(v.boolean(), true),
useDotIgnore: v.optional(v.boolean(), true),
useDefaultPatterns: v.optional(v.boolean(), true),
customPatterns: v.optional(v.array(v.string()), () => []),
}),
security: v.object({
enableSecurityCheck: v.optional(v.boolean(), true),
}),
tokenCount: v.object({
encoding: v.optional(v.picklist(TOKEN_ENCODINGS), 'o200k_base'),
}),
});
export const repomixConfigFileSchema = repomixConfigBaseSchema;
export const repomixConfigCliSchema = v.intersect([
repomixConfigBaseSchema,
v.object({
output: v.optional(v.object({
stdout: v.optional(v.boolean()),
})),
skillGenerate: v.optional(v.union([v.string(), v.boolean()])),
}),
]);
export const repomixConfigMergedSchema = v.intersect([
repomixConfigDefaultSchema,
repomixConfigFileSchema,
repomixConfigCliSchema,
v.object({
cwd: v.string(),
}),
]);
export const defaultConfig = v.parse(repomixConfigDefaultSchema, {
input: {},
output: {
git: {},
},
ignore: {},
security: {},
tokenCount: {},
});
export const defineConfig = (config) => config;