UNPKG

repomix

Version:

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

131 lines (130 loc) 5.52 kB
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;