From 7409157247822c4a37f687adc590732de4855877 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sat, 11 Oct 2025 00:52:14 +0900 Subject: [PATCH 01/16] feat(config): Add JavaScript/TypeScript config file support with defineConfig helper Add support for JavaScript configuration files (.js, .mjs, .cjs) with a defineConfig helper function for better DX, similar to Vite and ESLint. **Changes:** - Add defineConfig() helper function for type-safe config definitions - Support dynamic values (timestamps, environment variables, etc.) - Prioritize JS config files over JSON formats - Update documentation (README and website) with JS config examples - Add integration tests for JS config files **Priority order:** 1. repomix.config.js/mjs/cjs 2. repomix.config.json5 3. repomix.config.jsonc 4. repomix.config.json **Benefits:** - Better IDE support with TypeScript types - Dynamic configuration based on environment - More flexible than static JSON Relates to #870 --- README.md | 50 ++++++++++++- src/config/configLoad.ts | 31 ++++++-- src/config/configSchema.ts | 3 + src/index.ts | 1 + tests/config/configLoad.integration.test.ts | 60 ++++++++++++++++ tests/config/configLoad.test.ts | 19 ++++- .../config-js/repomix-dynamic.config.js | 13 ++++ tests/fixtures/config-js/repomix.config.cjs | 9 +++ tests/fixtures/config-js/repomix.config.js | 12 ++++ tests/fixtures/config-js/repomix.config.mjs | 11 +++ website/client/src/en/guide/configuration.md | 72 +++++++++++++++++-- website/client/src/ja/guide/configuration.md | 72 +++++++++++++++++-- 12 files changed, 337 insertions(+), 16 deletions(-) create mode 100644 tests/config/configLoad.integration.test.ts create mode 100644 tests/fixtures/config-js/repomix-dynamic.config.js create mode 100644 tests/fixtures/config-js/repomix.config.cjs create mode 100644 tests/fixtures/config-js/repomix.config.js create mode 100644 tests/fixtures/config-js/repomix.config.mjs diff --git a/README.md b/README.md index ecb68aa9c..70a61a799 100644 --- a/README.md +++ b/README.md @@ -995,12 +995,60 @@ When running as an MCP server, Repomix provides the following tools: ## ⚙️ Configuration -Create a `repomix.config.json` file in your project root for custom configurations. +Repomix supports multiple configuration file formats for flexibility and ease of use. + +### Configuration File Formats + +Repomix will automatically search for configuration files in the following priority order: + +1. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) +2. **JSON5** (`repomix.config.json5`) +3. **JSONC** (`repomix.config.jsonc`) +4. **JSON** (`repomix.config.json`) + +#### JavaScript Configuration (Recommended) + +JavaScript configuration files allow you to use dynamic values and leverage TypeScript type definitions for better IDE support: + +```javascript +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + // Use dynamic values like timestamps + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + +**CommonJS Example:** + +```javascript +// repomix.config.cjs +module.exports = { + output: { + // Use environment variables + filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', + style: 'xml', + }, +}; +``` + +#### JSON Configuration + +Create a `repomix.config.json` file in your project root: ```bash repomix --init ``` +### Configuration Options + Here's an explanation of the configuration options: | Option | Description | Default | diff --git a/src/config/configLoad.ts b/src/config/configLoad.ts index e892fac43..a6e314698 100644 --- a/src/config/configLoad.ts +++ b/src/config/configLoad.ts @@ -1,5 +1,6 @@ import * as fs from 'node:fs/promises'; import path from 'node:path'; +import { pathToFileURL } from 'node:url'; import JSON5 from 'json5'; import pc from 'picocolors'; import { RepomixError, rethrowValidationErrorIfZodError } from '../shared/errorHandle.js'; @@ -15,7 +16,14 @@ import { } from './configSchema.js'; import { getGlobalDirectory } from './globalDirectory.js'; -const defaultConfigPaths = ['repomix.config.json5', 'repomix.config.jsonc', 'repomix.config.json']; +const defaultConfigPaths = [ + 'repomix.config.js', + 'repomix.config.mjs', + 'repomix.config.cjs', + 'repomix.config.json5', + 'repomix.config.jsonc', + 'repomix.config.json', +]; const getGlobalConfigPaths = () => { const globalDir = getGlobalDirectory(); @@ -85,13 +93,28 @@ export const loadFileConfig = async (rootDir: string, argConfigPath: string | nu const loadAndValidateConfig = async (filePath: string): Promise => { try { - const fileContent = await fs.readFile(filePath, 'utf-8'); - const config = JSON5.parse(fileContent); + let config: unknown; + + // Check if the file is a JavaScript file + const isJsFile = filePath.endsWith('.js') || filePath.endsWith('.mjs') || filePath.endsWith('.cjs'); + + if (isJsFile) { + // Use dynamic import for JavaScript files + // Convert absolute path to file:// URL for Windows compatibility + const fileUrl = pathToFileURL(filePath).href; + const module = await import(fileUrl); + config = module.default || module; + } else { + // Use JSON5 for JSON/JSON5/JSONC files + const fileContent = await fs.readFile(filePath, 'utf-8'); + config = JSON5.parse(fileContent); + } + return repomixConfigFileSchema.parse(config); } catch (error) { rethrowValidationErrorIfZodError(error, 'Invalid config schema'); if (error instanceof SyntaxError) { - throw new RepomixError(`Invalid JSON5 in config file ${filePath}: ${error.message}`); + throw new RepomixError(`Invalid syntax in config file ${filePath}: ${error.message}`); } if (error instanceof Error) { throw new RepomixError(`Error loading config from ${filePath}: ${error.message}`); diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts index bb970bc97..844b923da 100644 --- a/src/config/configSchema.ts +++ b/src/config/configSchema.ts @@ -165,3 +165,6 @@ export type RepomixConfigCli = z.infer; export type RepomixConfigMerged = z.infer; export const defaultConfig = repomixConfigDefaultSchema.parse({}); + +// Helper function for type-safe config definition +export const defineConfig = (config: RepomixConfigFile): RepomixConfigFile => config; diff --git a/src/index.ts b/src/index.ts index a8ec83949..0c1e5bac5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -30,6 +30,7 @@ export { parseFile } from './core/treeSitter/parseFile.js'; // --------------------------------------------------------------------------------------------------------------------- export { loadFileConfig, mergeConfigs } from './config/configLoad.js'; export type { RepomixConfigFile as RepomixConfig } from './config/configSchema.js'; +export { defineConfig } from './config/configSchema.js'; export { defaultIgnoreList } from './config/defaultIgnore.js'; // --------------------------------------------------------------------------------------------------------------------- diff --git a/tests/config/configLoad.integration.test.ts b/tests/config/configLoad.integration.test.ts new file mode 100644 index 000000000..832ec45bd --- /dev/null +++ b/tests/config/configLoad.integration.test.ts @@ -0,0 +1,60 @@ +import path from 'node:path'; +import { describe, expect, test } from 'vitest'; +import { loadFileConfig } from '../../src/config/configLoad.js'; + +describe('configLoad Integration Tests', () => { + const fixturesDir = path.join(process.cwd(), 'tests/fixtures/config-js'); + + describe('JavaScript Config Files', () => { + test('should load .js config with ESM default export', async () => { + const config = await loadFileConfig(fixturesDir, 'repomix.config.js'); + + expect(config).toEqual({ + output: { + filePath: 'esm-output.xml', + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, + }); + }); + + test('should load .mjs config', async () => { + const config = await loadFileConfig(fixturesDir, 'repomix.config.mjs'); + + expect(config).toEqual({ + output: { + filePath: 'mjs-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/test/**'], + }, + }); + }); + + test('should load .cjs config with module.exports', async () => { + const config = await loadFileConfig(fixturesDir, 'repomix.config.cjs'); + + expect(config).toEqual({ + output: { + filePath: 'cjs-output.xml', + style: 'plain', + }, + ignore: { + customPatterns: ['**/build/**'], + }, + }); + }); + + test('should handle dynamic values in JS config', async () => { + const config = await loadFileConfig(fixturesDir, 'repomix-dynamic.config.js'); + + expect(config.output?.filePath).toMatch(/^output-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.xml$/); + expect(config.output?.style).toBe('xml'); + expect(config.ignore?.customPatterns).toEqual(['**/node_modules/**']); + }); + }); +}); diff --git a/tests/config/configLoad.test.ts b/tests/config/configLoad.test.ts index 40cb54482..8569a9fa0 100644 --- a/tests/config/configLoad.test.ts +++ b/tests/config/configLoad.test.ts @@ -58,9 +58,15 @@ describe('configLoad', () => { }; vi.mocked(getGlobalDirectory).mockReturnValue('/global/repomix'); vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.js + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.mjs + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.cjs .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.json5 .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.jsonc .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.json + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.js + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.mjs + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.cjs .mockResolvedValueOnce({ isFile: () => true } as Stats); // Global repomix.config.json5 vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockGlobalConfig)); @@ -87,7 +93,7 @@ describe('configLoad', () => { vi.mocked(fs.readFile).mockResolvedValue('invalid json'); vi.mocked(fs.stat).mockResolvedValue({ isFile: () => true } as Stats); - await expect(loadFileConfig(process.cwd(), 'test-config.json')).rejects.toThrow('Invalid JSON'); + await expect(loadFileConfig(process.cwd(), 'test-config.json')).rejects.toThrow('Invalid syntax'); }); test('should parse config file with comments', async () => { @@ -149,6 +155,9 @@ describe('configLoad', () => { ignore: { useDefaultPatterns: true }, }; vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.js + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mjs + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cjs .mockRejectedValueOnce(new Error('File not found')) // repomix.config.json5 .mockResolvedValueOnce({ isFile: () => true } as Stats); // repomix.config.jsonc vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockConfig)); @@ -163,14 +172,18 @@ describe('configLoad', () => { output: { filePath: 'json5-output.txt' }, ignore: { useDefaultPatterns: true }, }; - vi.mocked(fs.stat).mockResolvedValueOnce({ isFile: () => true } as Stats); // repomix.config.json5 exists + vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.js + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mjs + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cjs + .mockResolvedValueOnce({ isFile: () => true } as Stats); // repomix.config.json5 exists vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockConfig)); const result = await loadFileConfig(process.cwd(), null); expect(result).toEqual(mockConfig); expect(fs.readFile).toHaveBeenCalledWith(path.resolve(process.cwd(), 'repomix.config.json5'), 'utf-8'); // Should not check for .jsonc or .json since .json5 was found - expect(fs.stat).toHaveBeenCalledTimes(1); + expect(fs.stat).toHaveBeenCalledTimes(4); }); test('should throw RepomixError when specific config file does not exist', async () => { diff --git a/tests/fixtures/config-js/repomix-dynamic.config.js b/tests/fixtures/config-js/repomix-dynamic.config.js new file mode 100644 index 000000000..98060f383 --- /dev/null +++ b/tests/fixtures/config-js/repomix-dynamic.config.js @@ -0,0 +1,13 @@ +import { defineConfig } from '../../../src/index.js'; + +const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); + +export default defineConfig({ + output: { + filePath: `output-${timestamp}.xml`, + style: 'xml', + }, + ignore: { + customPatterns: ['**/node_modules/**'], + }, +}); diff --git a/tests/fixtures/config-js/repomix.config.cjs b/tests/fixtures/config-js/repomix.config.cjs new file mode 100644 index 000000000..8bbaf9636 --- /dev/null +++ b/tests/fixtures/config-js/repomix.config.cjs @@ -0,0 +1,9 @@ +module.exports = { + output: { + filePath: 'cjs-output.xml', + style: 'plain', + }, + ignore: { + customPatterns: ['**/build/**'], + }, +}; diff --git a/tests/fixtures/config-js/repomix.config.js b/tests/fixtures/config-js/repomix.config.js new file mode 100644 index 000000000..d07a471f0 --- /dev/null +++ b/tests/fixtures/config-js/repomix.config.js @@ -0,0 +1,12 @@ +import { defineConfig } from '../../../src/index.js'; + +export default defineConfig({ + output: { + filePath: 'esm-output.xml', + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); diff --git a/tests/fixtures/config-js/repomix.config.mjs b/tests/fixtures/config-js/repomix.config.mjs new file mode 100644 index 000000000..0c07dd904 --- /dev/null +++ b/tests/fixtures/config-js/repomix.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig } from '../../../src/index.js'; + +export default defineConfig({ + output: { + filePath: 'mjs-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/test/**'], + }, +}); diff --git a/website/client/src/en/guide/configuration.md b/website/client/src/en/guide/configuration.md index 1fd0a67fe..04f0c6d08 100644 --- a/website/client/src/en/guide/configuration.md +++ b/website/client/src/en/guide/configuration.md @@ -1,20 +1,84 @@ # Configuration -Repomix can be configured using a configuration file (`repomix.config.json`) or command-line options. The configuration file allows you to customize various aspects of how Repomix processes and outputs your codebase. +Repomix can be configured using a configuration file or command-line options. The configuration file allows you to customize various aspects of how Repomix processes and outputs your codebase. -## Quick Start +## Configuration File Formats + +Repomix supports multiple configuration file formats. When searching for a configuration file, Repomix will check in the following priority order: + +1. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) +2. **JSON5** (`repomix.config.json5`) +3. **JSONC** (`repomix.config.jsonc`) +4. **JSON** (`repomix.config.json`) + +### JavaScript Configuration (Recommended) + +JavaScript configuration files provide the most flexibility, allowing you to use dynamic values, environment variables, and TypeScript type definitions for better IDE support. + +**ES Module Example:** + +```javascript +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + // Use dynamic values like timestamps + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + +**CommonJS Example:** + +```javascript +// repomix.config.cjs +module.exports = { + output: { + // Use environment variables + filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/build/**'], + }, +}; +``` + +**Benefits of JavaScript Configuration:** +- Use dynamic values (timestamps, environment variables, etc.) +- Full TypeScript type support with `defineConfig` +- Conditional configuration based on environment +- More flexible and powerful than static JSON + +### JSON Configuration + +You can also use JSON-based configuration files. Create a `repomix.config.json` file in your project directory: -Create a configuration file in your project directory: ```bash repomix --init ``` -This will create a `repomix.config.json` file with default settings. You can also create a global configuration file that will be used as a fallback when no local configuration is found: +This will create a `repomix.config.json` file with default settings. + +### Global Configuration + +You can create a global configuration file that will be used as a fallback when no local configuration is found: ```bash repomix --init --global ``` +The global configuration file will be created in: +- Windows: `%LOCALAPPDATA%\Repomix\repomix.config.json` +- macOS/Linux: `$XDG_CONFIG_HOME/repomix/repomix.config.json` or `~/.config/repomix/repomix.config.json` + +Note: Local configuration (if present) takes precedence over global configuration. + ## Configuration Options | Option | Description | Default | diff --git a/website/client/src/ja/guide/configuration.md b/website/client/src/ja/guide/configuration.md index e441bb3e4..d86e7c06b 100644 --- a/website/client/src/ja/guide/configuration.md +++ b/website/client/src/ja/guide/configuration.md @@ -1,20 +1,84 @@ # 設定 -Repomixは設定ファイル(`repomix.config.json`)またはコマンドラインオプションを使用して設定できます。設定ファイルを使用することで、コードベースの処理と出力方法をカスタマイズできます。 +Repomixは設定ファイルまたはコマンドラインオプションを使用して設定できます。設定ファイルを使用することで、コードベースの処理と出力方法をカスタマイズできます。 -## クイックスタート +## 設定ファイルの形式 + +Repomixは複数の設定ファイル形式をサポートしています。設定ファイルを検索する際、Repomixは以下の優先順位でチェックします: + +1. **JavaScript/ES Module** (`repomix.config.js`、`repomix.config.mjs`、`repomix.config.cjs`) +2. **JSON5** (`repomix.config.json5`) +3. **JSONC** (`repomix.config.jsonc`) +4. **JSON** (`repomix.config.json`) + +### JavaScript設定(推奨) + +JavaScript設定ファイルは最も柔軟性が高く、動的な値、環境変数の使用、TypeScript型定義によるIDEサポートの向上を実現できます。 + +**ES Moduleの例:** + +```javascript +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + // タイムスタンプなどの動的な値を使用 + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + +**CommonJSの例:** + +```javascript +// repomix.config.cjs +module.exports = { + output: { + // 環境変数を使用 + filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/build/**'], + }, +}; +``` + +**JavaScript設定のメリット:** +- 動的な値(タイムスタンプ、環境変数など)を使用可能 +- `defineConfig`による完全なTypeScript型サポート +- 環境に基づいた条件付き設定 +- 静的なJSONよりも柔軟で強力 + +### JSON設定 + +JSON形式の設定ファイルも使用できます。プロジェクトディレクトリに`repomix.config.json`ファイルを作成します: -プロジェクトディレクトリに設定ファイルを作成します: ```bash repomix --init ``` -これにより、デフォルト設定の`repomix.config.json`ファイルが作成されます。また、ローカル設定が見つからない場合のフォールバックとして使用されるグローバル設定ファイルを作成することもできます: +これにより、デフォルト設定の`repomix.config.json`ファイルが作成されます。 + +### グローバル設定 + +ローカル設定が見つからない場合のフォールバックとして使用されるグローバル設定ファイルを作成できます: ```bash repomix --init --global ``` +グローバル設定ファイルは以下の場所に作成されます: +- Windows: `%LOCALAPPDATA%\Repomix\repomix.config.json` +- macOS/Linux: `$XDG_CONFIG_HOME/repomix/repomix.config.json` または `~/.config/repomix/repomix.config.json` + +注:ローカル設定(存在する場合)はグローバル設定よりも優先されます。 + ## 設定オプション | オプション | 説明 | デフォルト値 | From a47265cbadda1137197279e9221f9a3af83f6a51 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 13:54:34 +0900 Subject: [PATCH 02/16] feat(config): Add TypeScript config file support with jiti Add support for TypeScript configuration files (.ts, .mts, .cts) using jiti for better developer experience. **Changes:** - Install jiti dependency for TypeScript transpilation - Update config file priority: TS > JS > JSON - Add TypeScript config test fixtures - Add integration tests for all TS config formats - Update documentation (README and website) with TS examples - Fix existing tests to account for new priority order **Priority order:** 1. repomix.config.ts/mts/cts 2. repomix.config.js/mjs/cjs 3. repomix.config.json5 4. repomix.config.jsonc 5. repomix.config.json **Benefits:** - Full TypeScript type checking in config files - Excellent IDE autocomplete and IntelliSense - Compile-time error detection - Dynamic configuration with type safety Relates to #870 --- README.md | 41 ++++++++++-- package-lock.json | 17 +++-- package.json | 1 + src/config/configLoad.ts | 16 ++++- tests/config/configLoad.integration.test.ts | 67 +++++++++++++++++-- tests/config/configLoad.test.ts | 14 +++- .../config-ts/repomix-dynamic.config.ts | 14 ++++ tests/fixtures/config-ts/repomix.config.cts | 11 +++ tests/fixtures/config-ts/repomix.config.mts | 11 +++ tests/fixtures/config-ts/repomix.config.ts | 12 ++++ website/client/src/en/guide/configuration.md | 49 ++++++++++---- website/client/src/ja/guide/configuration.md | 49 ++++++++++---- 12 files changed, 252 insertions(+), 50 deletions(-) create mode 100644 tests/fixtures/config-ts/repomix-dynamic.config.ts create mode 100644 tests/fixtures/config-ts/repomix.config.cts create mode 100644 tests/fixtures/config-ts/repomix.config.mts create mode 100644 tests/fixtures/config-ts/repomix.config.ts diff --git a/README.md b/README.md index 70a61a799..ac120f9e1 100644 --- a/README.md +++ b/README.md @@ -1001,16 +1001,18 @@ Repomix supports multiple configuration file formats for flexibility and ease of Repomix will automatically search for configuration files in the following priority order: -1. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) -2. **JSON5** (`repomix.config.json5`) -3. **JSONC** (`repomix.config.jsonc`) -4. **JSON** (`repomix.config.json`) +1. **TypeScript** (`repomix.config.ts`, `repomix.config.mts`, `repomix.config.cts`) +2. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) +3. **JSON5** (`repomix.config.json5`) +4. **JSONC** (`repomix.config.jsonc`) +5. **JSON** (`repomix.config.json`) -#### JavaScript Configuration (Recommended) +#### TypeScript Configuration (Recommended) -JavaScript configuration files allow you to use dynamic values and leverage TypeScript type definitions for better IDE support: +TypeScript configuration files provide the best developer experience with full type checking and IDE support: -```javascript +```typescript +// repomix.config.ts import { defineConfig } from 'repomix'; export default defineConfig({ @@ -1026,6 +1028,31 @@ export default defineConfig({ }); ``` +**Benefits of TypeScript Configuration:** +- ✅ Full TypeScript type checking +- ✅ Excellent IDE autocomplete and IntelliSense +- ✅ Compile-time error detection +- ✅ Use dynamic values (timestamps, environment variables, etc.) + +#### JavaScript Configuration + +JavaScript configuration files also support dynamic values and type definitions: + +```javascript +// repomix.config.js +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + **CommonJS Example:** ```javascript diff --git a/package-lock.json b/package-lock.json index 8a43e592f..763a94a0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "handlebars": "^4.7.8", "iconv-lite": "^0.7.0", "istextorbinary": "^9.5.0", + "jiti": "^2.6.1", "jschardet": "^3.1.4", "json5": "^2.2.3", "log-update": "^7.0.1", @@ -1724,7 +1725,6 @@ "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.14.0" } @@ -3557,6 +3557,15 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", @@ -5450,7 +5459,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5523,7 +5531,6 @@ "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -5675,7 +5682,6 @@ "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -5792,7 +5798,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5806,7 +5811,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -6062,7 +6066,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 72964fc43..8109e60ec 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "handlebars": "^4.7.8", "iconv-lite": "^0.7.0", "istextorbinary": "^9.5.0", + "jiti": "^2.6.1", "jschardet": "^3.1.4", "json5": "^2.2.3", "log-update": "^7.0.1", diff --git a/src/config/configLoad.ts b/src/config/configLoad.ts index a6e314698..e9e64da25 100644 --- a/src/config/configLoad.ts +++ b/src/config/configLoad.ts @@ -1,6 +1,7 @@ import * as fs from 'node:fs/promises'; import path from 'node:path'; import { pathToFileURL } from 'node:url'; +import { createJiti } from 'jiti'; import JSON5 from 'json5'; import pc from 'picocolors'; import { RepomixError, rethrowValidationErrorIfZodError } from '../shared/errorHandle.js'; @@ -17,6 +18,9 @@ import { import { getGlobalDirectory } from './globalDirectory.js'; const defaultConfigPaths = [ + 'repomix.config.ts', + 'repomix.config.mts', + 'repomix.config.cts', 'repomix.config.js', 'repomix.config.mjs', 'repomix.config.cjs', @@ -95,10 +99,18 @@ const loadAndValidateConfig = async (filePath: string): Promise { - const fixturesDir = path.join(process.cwd(), 'tests/fixtures/config-js'); + const jsFixturesDir = path.join(process.cwd(), 'tests/fixtures/config-js'); + const tsFixturesDir = path.join(process.cwd(), 'tests/fixtures/config-ts'); + + describe('TypeScript Config Files', () => { + test('should load .ts config with ESM default export', async () => { + const config = await loadFileConfig(tsFixturesDir, 'repomix.config.ts'); + + expect(config).toEqual({ + output: { + filePath: 'ts-output.xml', + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, + }); + }); + + test('should load .mts config', async () => { + const config = await loadFileConfig(tsFixturesDir, 'repomix.config.mts'); + + expect(config).toEqual({ + output: { + filePath: 'mts-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/test/**'], + }, + }); + }); + + test('should load .cts config', async () => { + const config = await loadFileConfig(tsFixturesDir, 'repomix.config.cts'); + + expect(config).toEqual({ + output: { + filePath: 'cts-output.xml', + style: 'plain', + }, + ignore: { + customPatterns: ['**/build/**'], + }, + }); + }); + + test('should handle dynamic values in TypeScript config', async () => { + const config = await loadFileConfig(tsFixturesDir, 'repomix-dynamic.config.ts'); + + // Vitest runs with NODE_ENV=test, so we need to include 'test' in the pattern + expect(config.output?.filePath).toMatch( + /^output-(test|development|production)-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.xml$/, + ); + expect(config.output?.style).toBe('xml'); + expect(config.ignore?.customPatterns).toEqual(['**/node_modules/**']); + }); + }); describe('JavaScript Config Files', () => { test('should load .js config with ESM default export', async () => { - const config = await loadFileConfig(fixturesDir, 'repomix.config.js'); + const config = await loadFileConfig(jsFixturesDir, 'repomix.config.js'); expect(config).toEqual({ output: { @@ -22,7 +79,7 @@ describe('configLoad Integration Tests', () => { }); test('should load .mjs config', async () => { - const config = await loadFileConfig(fixturesDir, 'repomix.config.mjs'); + const config = await loadFileConfig(jsFixturesDir, 'repomix.config.mjs'); expect(config).toEqual({ output: { @@ -36,7 +93,7 @@ describe('configLoad Integration Tests', () => { }); test('should load .cjs config with module.exports', async () => { - const config = await loadFileConfig(fixturesDir, 'repomix.config.cjs'); + const config = await loadFileConfig(jsFixturesDir, 'repomix.config.cjs'); expect(config).toEqual({ output: { @@ -50,7 +107,7 @@ describe('configLoad Integration Tests', () => { }); test('should handle dynamic values in JS config', async () => { - const config = await loadFileConfig(fixturesDir, 'repomix-dynamic.config.js'); + const config = await loadFileConfig(jsFixturesDir, 'repomix-dynamic.config.js'); expect(config.output?.filePath).toMatch(/^output-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.xml$/); expect(config.output?.style).toBe('xml'); diff --git a/tests/config/configLoad.test.ts b/tests/config/configLoad.test.ts index 8569a9fa0..b2378d014 100644 --- a/tests/config/configLoad.test.ts +++ b/tests/config/configLoad.test.ts @@ -58,12 +58,18 @@ describe('configLoad', () => { }; vi.mocked(getGlobalDirectory).mockReturnValue('/global/repomix'); vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.ts + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.mts + .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.cts .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.js .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.mjs .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.cjs .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.json5 .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.jsonc .mockRejectedValueOnce(new Error('File not found')) // Local repomix.config.json + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.ts + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.mts + .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.cts .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.js .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.mjs .mockRejectedValueOnce(new Error('File not found')) // Global repomix.config.cjs @@ -155,6 +161,9 @@ describe('configLoad', () => { ignore: { useDefaultPatterns: true }, }; vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.ts + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mts + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cts .mockRejectedValueOnce(new Error('File not found')) // repomix.config.js .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mjs .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cjs @@ -173,6 +182,9 @@ describe('configLoad', () => { ignore: { useDefaultPatterns: true }, }; vi.mocked(fs.stat) + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.ts + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mts + .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cts .mockRejectedValueOnce(new Error('File not found')) // repomix.config.js .mockRejectedValueOnce(new Error('File not found')) // repomix.config.mjs .mockRejectedValueOnce(new Error('File not found')) // repomix.config.cjs @@ -183,7 +195,7 @@ describe('configLoad', () => { expect(result).toEqual(mockConfig); expect(fs.readFile).toHaveBeenCalledWith(path.resolve(process.cwd(), 'repomix.config.json5'), 'utf-8'); // Should not check for .jsonc or .json since .json5 was found - expect(fs.stat).toHaveBeenCalledTimes(4); + expect(fs.stat).toHaveBeenCalledTimes(7); }); test('should throw RepomixError when specific config file does not exist', async () => { diff --git a/tests/fixtures/config-ts/repomix-dynamic.config.ts b/tests/fixtures/config-ts/repomix-dynamic.config.ts new file mode 100644 index 000000000..f6ecd20a2 --- /dev/null +++ b/tests/fixtures/config-ts/repomix-dynamic.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '../../../src/index.js'; + +const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); +const environment = process.env.NODE_ENV || 'development'; + +export default defineConfig({ + output: { + filePath: `output-${environment}-${timestamp}.xml`, + style: 'xml', + }, + ignore: { + customPatterns: ['**/node_modules/**'], + }, +}); diff --git a/tests/fixtures/config-ts/repomix.config.cts b/tests/fixtures/config-ts/repomix.config.cts new file mode 100644 index 000000000..5be760ec2 --- /dev/null +++ b/tests/fixtures/config-ts/repomix.config.cts @@ -0,0 +1,11 @@ +import { defineConfig } from '../../../src/index.js'; + +export default defineConfig({ + output: { + filePath: 'cts-output.xml', + style: 'plain', + }, + ignore: { + customPatterns: ['**/build/**'], + }, +}); diff --git a/tests/fixtures/config-ts/repomix.config.mts b/tests/fixtures/config-ts/repomix.config.mts new file mode 100644 index 000000000..fe58ce65e --- /dev/null +++ b/tests/fixtures/config-ts/repomix.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from '../../../src/index.js'; + +export default defineConfig({ + output: { + filePath: 'mts-output.xml', + style: 'xml', + }, + ignore: { + customPatterns: ['**/test/**'], + }, +}); diff --git a/tests/fixtures/config-ts/repomix.config.ts b/tests/fixtures/config-ts/repomix.config.ts new file mode 100644 index 000000000..fed879f41 --- /dev/null +++ b/tests/fixtures/config-ts/repomix.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '../../../src/index.js'; + +export default defineConfig({ + output: { + filePath: 'ts-output.xml', + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); diff --git a/website/client/src/en/guide/configuration.md b/website/client/src/en/guide/configuration.md index 04f0c6d08..185b3ad06 100644 --- a/website/client/src/en/guide/configuration.md +++ b/website/client/src/en/guide/configuration.md @@ -6,26 +6,53 @@ Repomix can be configured using a configuration file or command-line options. Th Repomix supports multiple configuration file formats. When searching for a configuration file, Repomix will check in the following priority order: -1. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) -2. **JSON5** (`repomix.config.json5`) -3. **JSONC** (`repomix.config.jsonc`) -4. **JSON** (`repomix.config.json`) +1. **TypeScript** (`repomix.config.ts`, `repomix.config.mts`, `repomix.config.cts`) +2. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) +3. **JSON5** (`repomix.config.json5`) +4. **JSONC** (`repomix.config.jsonc`) +5. **JSON** (`repomix.config.json`) -### JavaScript Configuration (Recommended) +### TypeScript Configuration (Recommended) -JavaScript configuration files provide the most flexibility, allowing you to use dynamic values, environment variables, and TypeScript type definitions for better IDE support. +TypeScript configuration files provide the best developer experience with full type checking and IDE support: + +```typescript +// repomix.config.ts +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + // Use dynamic values like timestamps + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + +**Benefits of TypeScript Configuration:** +- ✅ Full TypeScript type checking +- ✅ Excellent IDE autocomplete and IntelliSense +- ✅ Compile-time error detection +- ✅ Use dynamic values (timestamps, environment variables, etc.) + +### JavaScript Configuration + +JavaScript configuration files also provide flexibility with dynamic values and type support: **ES Module Example:** ```javascript +// repomix.config.js import { defineConfig } from 'repomix'; export default defineConfig({ output: { - // Use dynamic values like timestamps filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, style: 'xml', - removeComments: true, }, ignore: { customPatterns: ['**/node_modules/**', '**/dist/**'], @@ -49,12 +76,6 @@ module.exports = { }; ``` -**Benefits of JavaScript Configuration:** -- Use dynamic values (timestamps, environment variables, etc.) -- Full TypeScript type support with `defineConfig` -- Conditional configuration based on environment -- More flexible and powerful than static JSON - ### JSON Configuration You can also use JSON-based configuration files. Create a `repomix.config.json` file in your project directory: diff --git a/website/client/src/ja/guide/configuration.md b/website/client/src/ja/guide/configuration.md index d86e7c06b..dea9702c2 100644 --- a/website/client/src/ja/guide/configuration.md +++ b/website/client/src/ja/guide/configuration.md @@ -6,26 +6,53 @@ Repomixは設定ファイルまたはコマンドラインオプションを使 Repomixは複数の設定ファイル形式をサポートしています。設定ファイルを検索する際、Repomixは以下の優先順位でチェックします: -1. **JavaScript/ES Module** (`repomix.config.js`、`repomix.config.mjs`、`repomix.config.cjs`) -2. **JSON5** (`repomix.config.json5`) -3. **JSONC** (`repomix.config.jsonc`) -4. **JSON** (`repomix.config.json`) +1. **TypeScript** (`repomix.config.ts`、`repomix.config.mts`、`repomix.config.cts`) +2. **JavaScript/ES Module** (`repomix.config.js`、`repomix.config.mjs`、`repomix.config.cjs`) +3. **JSON5** (`repomix.config.json5`) +4. **JSONC** (`repomix.config.jsonc`) +5. **JSON** (`repomix.config.json`) -### JavaScript設定(推奨) +### TypeScript設定(推奨) -JavaScript設定ファイルは最も柔軟性が高く、動的な値、環境変数の使用、TypeScript型定義によるIDEサポートの向上を実現できます。 +TypeScript設定ファイルは、完全な型チェックとIDEサポートにより、最高の開発者体験を提供します: + +```typescript +// repomix.config.ts +import { defineConfig } from 'repomix'; + +export default defineConfig({ + output: { + // タイムスタンプなどの動的な値を使用 + filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + style: 'xml', + removeComments: true, + }, + ignore: { + customPatterns: ['**/node_modules/**', '**/dist/**'], + }, +}); +``` + +**TypeScript設定のメリット:** +- ✅ 完全なTypeScript型チェック +- ✅ 優れたIDE自動補完とIntelliSense +- ✅ コンパイル時のエラー検出 +- ✅ 動的な値(タイムスタンプ、環境変数など)の使用が可能 + +### JavaScript設定 + +JavaScript設定ファイルも動的な値と型サポートを提供します: **ES Moduleの例:** ```javascript +// repomix.config.js import { defineConfig } from 'repomix'; export default defineConfig({ output: { - // タイムスタンプなどの動的な値を使用 filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, style: 'xml', - removeComments: true, }, ignore: { customPatterns: ['**/node_modules/**', '**/dist/**'], @@ -49,12 +76,6 @@ module.exports = { }; ``` -**JavaScript設定のメリット:** -- 動的な値(タイムスタンプ、環境変数など)を使用可能 -- `defineConfig`による完全なTypeScript型サポート -- 環境に基づいた条件付き設定 -- 静的なJSONよりも柔軟で強力 - ### JSON設定 JSON形式の設定ファイルも使用できます。プロジェクトディレクトリに`repomix.config.json`ファイルを作成します: From 0dc6df23c0bec78f4644b1c7a753566e33d15cbc Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 13:56:34 +0900 Subject: [PATCH 03/16] refactor(config): Use switch statement for file type checking Refactor file type checking to use switch statement for better readability and maintainability. **Changes:** - Add getFileExtension helper function - Replace if-else chain with switch statement - Group file extensions by type (ts/js/json) - Add default case for unsupported formats **Benefits:** - Cleaner and more maintainable code - Easier to add new file formats in the future - Better error handling for unsupported formats --- src/config/configLoad.ts | 64 ++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/config/configLoad.ts b/src/config/configLoad.ts index e9e64da25..56ffd4c55 100644 --- a/src/config/configLoad.ts +++ b/src/config/configLoad.ts @@ -95,31 +95,51 @@ export const loadFileConfig = async (rootDir: string, argConfigPath: string | nu return {}; }; +const getFileExtension = (filePath: string): string => { + const match = filePath.match(/\.(ts|mts|cts|js|mjs|cjs|json5|jsonc|json)$/); + return match ? match[1] : ''; +}; + const loadAndValidateConfig = async (filePath: string): Promise => { try { let config: unknown; - - // Check file type - const isTsFile = filePath.endsWith('.ts') || filePath.endsWith('.mts') || filePath.endsWith('.cts'); - const isJsFile = filePath.endsWith('.js') || filePath.endsWith('.mjs') || filePath.endsWith('.cjs'); - - if (isTsFile) { - // Use jiti for TypeScript files - const jiti = createJiti(import.meta.url, { - moduleCache: false, // Disable cache to avoid issues in tests - interopDefault: true, // Automatically use default export - }); - config = await jiti.import(pathToFileURL(filePath).href); - } else if (isJsFile) { - // Use dynamic import for JavaScript files - // Convert absolute path to file:// URL for Windows compatibility - const fileUrl = pathToFileURL(filePath).href; - const module = await import(fileUrl); - config = module.default || module; - } else { - // Use JSON5 for JSON/JSON5/JSONC files - const fileContent = await fs.readFile(filePath, 'utf-8'); - config = JSON5.parse(fileContent); + const ext = getFileExtension(filePath); + + switch (ext) { + case 'ts': + case 'mts': + case 'cts': { + // Use jiti for TypeScript files + const jiti = createJiti(import.meta.url, { + moduleCache: false, // Disable cache to avoid issues in tests + interopDefault: true, // Automatically use default export + }); + config = await jiti.import(pathToFileURL(filePath).href); + break; + } + + case 'js': + case 'mjs': + case 'cjs': { + // Use dynamic import for JavaScript files + // Convert absolute path to file:// URL for Windows compatibility + const fileUrl = pathToFileURL(filePath).href; + const module = await import(fileUrl); + config = module.default || module; + break; + } + + case 'json5': + case 'jsonc': + case 'json': { + // Use JSON5 for JSON/JSON5/JSONC files + const fileContent = await fs.readFile(filePath, 'utf-8'); + config = JSON5.parse(fileContent); + break; + } + + default: + throw new RepomixError(`Unsupported config file format: ${filePath}`); } return repomixConfigFileSchema.parse(config); From a506201e69d6463d2008999ef8e8c6c32791fb84 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 14:09:10 +0900 Subject: [PATCH 04/16] docs(config): Add installation requirement for TypeScript/JavaScript config Add documentation about the need to install repomix as a dev dependency when using TypeScript or JavaScript configuration files with defineConfig. **Changes:** - Add installation section to README.md - Add installation section to website documentation (en/ja) - Create repomix.config.ts as an example for the project itself **Key points:** - npm install -D repomix is required for defineConfig import - This enables TypeScript type checking and IDE support - Applies to both TypeScript and JavaScript config files --- README.md | 14 ++++- repomix.config.json | 44 ---------------- repomix.config.ts | 55 ++++++++++++++++++++ website/client/src/en/guide/configuration.md | 14 ++++- website/client/src/ja/guide/configuration.md | 14 ++++- 5 files changed, 91 insertions(+), 50 deletions(-) delete mode 100644 repomix.config.json create mode 100644 repomix.config.ts diff --git a/README.md b/README.md index ac120f9e1..52f116552 100644 --- a/README.md +++ b/README.md @@ -1009,7 +1009,17 @@ Repomix will automatically search for configuration files in the following prior #### TypeScript Configuration (Recommended) -TypeScript configuration files provide the best developer experience with full type checking and IDE support: +TypeScript configuration files provide the best developer experience with full type checking and IDE support. + +**Installation:** + +To use TypeScript or JavaScript configuration with `defineConfig`, you need to install Repomix as a dev dependency: + +```bash +npm install -D repomix +``` + +**Example:** ```typescript // repomix.config.ts @@ -1028,7 +1038,7 @@ export default defineConfig({ }); ``` -**Benefits of TypeScript Configuration:** +**Benefits:** - ✅ Full TypeScript type checking - ✅ Excellent IDE autocomplete and IntelliSense - ✅ Compile-time error detection diff --git a/repomix.config.json b/repomix.config.json deleted file mode 100644 index 61147eb44..000000000 --- a/repomix.config.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "https://repomix.com/schemas/latest/schema.json", - "input": { - "maxFileSize": 50000000 - }, - "output": { - "filePath": "repomix-output.xml", - "style": "xml", - "parsableStyle": false, - "compress": false, - "headerText": "This repository contains the source code for the Repomix tool.\nRepomix is designed to pack repository contents into a single file,\nmaking it easier for AI systems to analyze and process the codebase.\n\nKey Features:\n- Configurable ignore patterns\n- Custom header text support\n- Efficient file processing and packing\n\nPlease refer to the README.md file for more detailed information on usage and configuration.\n", - "instructionFilePath": "repomix-instruction.md", - "fileSummary": true, - "directoryStructure": true, - "files": true, - "removeComments": false, - "removeEmptyLines": false, - "topFilesLength": 5, - "showLineNumbers": false, - "includeEmptyDirectories": true, - "truncateBase64": true, - "tokenCountTree": 50000, - "git": { - "sortByChanges": true, - "sortByChangesMaxCommits": 100, - "includeDiffs": true, - "includeLogs": true, - "includeLogsCount": 50 - } - }, - "include": [], - "ignore": { - "useGitignore": true, - "useDefaultPatterns": true, - // ignore is specified in .repomixignore - "customPatterns": [] - }, - "security": { - "enableSecurityCheck": true - }, - "tokenCount": { - "encoding": "o200k_base" - } -} diff --git a/repomix.config.ts b/repomix.config.ts new file mode 100644 index 000000000..4ee71f717 --- /dev/null +++ b/repomix.config.ts @@ -0,0 +1,55 @@ +import { defineConfig } from './src/index.js'; + +export default defineConfig({ + input: { + maxFileSize: 50000000, + }, + output: { + filePath: 'repomix-output.xml', + style: 'xml', + parsableStyle: false, + compress: false, + headerText: `This repository contains the source code for the Repomix tool. +Repomix is designed to pack repository contents into a single file, +making it easier for AI systems to analyze and process the codebase. + +Key Features: +- Configurable ignore patterns +- Custom header text support +- Efficient file processing and packing + +Please refer to the README.md file for more detailed information on usage and configuration. +`, + instructionFilePath: 'repomix-instruction.md', + fileSummary: true, + directoryStructure: true, + files: true, + removeComments: false, + removeEmptyLines: false, + topFilesLength: 5, + showLineNumbers: false, + includeEmptyDirectories: true, + truncateBase64: true, + tokenCountTree: 50000, + git: { + sortByChanges: true, + sortByChangesMaxCommits: 100, + includeDiffs: true, + includeLogs: true, + includeLogsCount: 50, + }, + }, + include: [], + ignore: { + useGitignore: true, + useDefaultPatterns: true, + // ignore is specified in .repomixignore + customPatterns: [], + }, + security: { + enableSecurityCheck: true, + }, + tokenCount: { + encoding: 'o200k_base', + }, +}); diff --git a/website/client/src/en/guide/configuration.md b/website/client/src/en/guide/configuration.md index 185b3ad06..c269bcafe 100644 --- a/website/client/src/en/guide/configuration.md +++ b/website/client/src/en/guide/configuration.md @@ -14,7 +14,17 @@ Repomix supports multiple configuration file formats. When searching for a confi ### TypeScript Configuration (Recommended) -TypeScript configuration files provide the best developer experience with full type checking and IDE support: +TypeScript configuration files provide the best developer experience with full type checking and IDE support. + +**Installation:** + +To use TypeScript or JavaScript configuration with `defineConfig`, you need to install Repomix as a dev dependency: + +```bash +npm install -D repomix +``` + +**Example:** ```typescript // repomix.config.ts @@ -33,7 +43,7 @@ export default defineConfig({ }); ``` -**Benefits of TypeScript Configuration:** +**Benefits:** - ✅ Full TypeScript type checking - ✅ Excellent IDE autocomplete and IntelliSense - ✅ Compile-time error detection diff --git a/website/client/src/ja/guide/configuration.md b/website/client/src/ja/guide/configuration.md index dea9702c2..dcc0849ab 100644 --- a/website/client/src/ja/guide/configuration.md +++ b/website/client/src/ja/guide/configuration.md @@ -14,7 +14,17 @@ Repomixは複数の設定ファイル形式をサポートしています。設 ### TypeScript設定(推奨) -TypeScript設定ファイルは、完全な型チェックとIDEサポートにより、最高の開発者体験を提供します: +TypeScript設定ファイルは、完全な型チェックとIDEサポートにより、最高の開発者体験を提供します。 + +**インストール:** + +TypeScriptまたはJavaScript設定で `defineConfig` を使用するには、Repomixを開発用依存関係としてインストールする必要があります: + +```bash +npm install -D repomix +``` + +**例:** ```typescript // repomix.config.ts @@ -33,7 +43,7 @@ export default defineConfig({ }); ``` -**TypeScript設定のメリット:** +**メリット:** - ✅ 完全なTypeScript型チェック - ✅ 優れたIDE自動補完とIntelliSense - ✅ コンパイル時のエラー検出 From 751c9997fe9259aa25cebf8b5f3479cff66c2ad2 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 14:11:33 +0900 Subject: [PATCH 05/16] docs(config): Add comment explaining direct import in repomix.config.ts Add clarifying comment that this config file uses a direct import from ./src/index.js because it's the repomix project itself, while normal users should import from 'repomix'. --- repomix.config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/repomix.config.ts b/repomix.config.ts index 4ee71f717..a53d09503 100644 --- a/repomix.config.ts +++ b/repomix.config.ts @@ -1,3 +1,6 @@ +// Note: Normally you would import from 'repomix', but since this is the repomix project itself, +// we import directly from the source index file. +// For your projects, use: import { defineConfig } from 'repomix'; import { defineConfig } from './src/index.js'; export default defineConfig({ From d5c06476d6a0ed599794ac140a4c674c6911a373 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 16:49:48 +0900 Subject: [PATCH 06/16] docs(config): Add timestamp examples for dynamic config values Added separate examples showing how to use dynamic values (timestamps and environment variables) in TypeScript and JavaScript config files. This makes it clearer how users can implement the timestamp suffix feature requested in issue #870. Changes: - Separated basic and dynamic value examples for TypeScript config - Added environment variable example for JavaScript config - Updated CommonJS example to show timestamp usage - Improved code organization and readability --- README.md | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 52f116552..e35ee792f 100644 --- a/README.md +++ b/README.md @@ -1027,8 +1027,7 @@ import { defineConfig } from 'repomix'; export default defineConfig({ output: { - // Use dynamic values like timestamps - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + filePath: 'output.xml', style: 'xml', removeComments: true, }, @@ -1044,6 +1043,23 @@ export default defineConfig({ - ✅ Compile-time error detection - ✅ Use dynamic values (timestamps, environment variables, etc.) +**Dynamic Values Example:** + +```typescript +// repomix.config.ts +import { defineConfig } from 'repomix'; + +// Generate timestamp-based filename +const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); + +export default defineConfig({ + output: { + filePath: `output-${timestamp}.xml`, + style: 'xml', + }, +}); +``` + #### JavaScript Configuration JavaScript configuration files also support dynamic values and type definitions: @@ -1054,7 +1070,7 @@ import { defineConfig } from 'repomix'; export default defineConfig({ output: { - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, + filePath: 'output.xml', style: 'xml', }, ignore: { @@ -1063,14 +1079,32 @@ export default defineConfig({ }); ``` +**Dynamic Values with Environment Variables:** + +```javascript +// repomix.config.js +import { defineConfig } from 'repomix'; + +const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); +const environment = process.env.NODE_ENV || 'development'; + +export default defineConfig({ + output: { + filePath: `output-${environment}-${timestamp}.xml`, + style: 'xml', + }, +}); +``` + **CommonJS Example:** ```javascript // repomix.config.cjs +const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); + module.exports = { output: { - // Use environment variables - filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', + filePath: `output-${timestamp}.xml`, style: 'xml', }, }; From 6b1340de4e11102198c2c789533b7c96f90e5892 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 16:58:07 +0900 Subject: [PATCH 07/16] docs(config): Fix misleading TypeScript benefits description Changed "Compile-time error detection" to "Real-time error detection while editing" to accurately reflect that type checking happens in the IDE, not during Repomix execution. Since jiti loads TypeScript files at runtime, compile-time checks are not performed automatically - type errors are only caught in the IDE or when manually running tsc. This provides a more accurate description of the actual developer experience. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e35ee792f..0c9545dd0 100644 --- a/README.md +++ b/README.md @@ -1038,9 +1038,9 @@ export default defineConfig({ ``` **Benefits:** -- ✅ Full TypeScript type checking +- ✅ Full TypeScript type checking in your IDE - ✅ Excellent IDE autocomplete and IntelliSense -- ✅ Compile-time error detection +- ✅ Real-time error detection while editing - ✅ Use dynamic values (timestamps, environment variables, etc.) **Dynamic Values Example:** From 9547addecf07f9c77a7010055a0163060b912c1d Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:30:39 +0900 Subject: [PATCH 08/16] docs: Reset website docs --- website/client/src/en/guide/configuration.md | 103 +------------------ website/client/src/ja/guide/configuration.md | 103 +------------------ 2 files changed, 8 insertions(+), 198 deletions(-) diff --git a/website/client/src/en/guide/configuration.md b/website/client/src/en/guide/configuration.md index c269bcafe..1fd0a67fe 100644 --- a/website/client/src/en/guide/configuration.md +++ b/website/client/src/en/guide/configuration.md @@ -1,115 +1,20 @@ # Configuration -Repomix can be configured using a configuration file or command-line options. The configuration file allows you to customize various aspects of how Repomix processes and outputs your codebase. +Repomix can be configured using a configuration file (`repomix.config.json`) or command-line options. The configuration file allows you to customize various aspects of how Repomix processes and outputs your codebase. -## Configuration File Formats - -Repomix supports multiple configuration file formats. When searching for a configuration file, Repomix will check in the following priority order: - -1. **TypeScript** (`repomix.config.ts`, `repomix.config.mts`, `repomix.config.cts`) -2. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) -3. **JSON5** (`repomix.config.json5`) -4. **JSONC** (`repomix.config.jsonc`) -5. **JSON** (`repomix.config.json`) - -### TypeScript Configuration (Recommended) - -TypeScript configuration files provide the best developer experience with full type checking and IDE support. - -**Installation:** - -To use TypeScript or JavaScript configuration with `defineConfig`, you need to install Repomix as a dev dependency: - -```bash -npm install -D repomix -``` - -**Example:** - -```typescript -// repomix.config.ts -import { defineConfig } from 'repomix'; - -export default defineConfig({ - output: { - // Use dynamic values like timestamps - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, - style: 'xml', - removeComments: true, - }, - ignore: { - customPatterns: ['**/node_modules/**', '**/dist/**'], - }, -}); -``` - -**Benefits:** -- ✅ Full TypeScript type checking -- ✅ Excellent IDE autocomplete and IntelliSense -- ✅ Compile-time error detection -- ✅ Use dynamic values (timestamps, environment variables, etc.) - -### JavaScript Configuration - -JavaScript configuration files also provide flexibility with dynamic values and type support: - -**ES Module Example:** - -```javascript -// repomix.config.js -import { defineConfig } from 'repomix'; - -export default defineConfig({ - output: { - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, - style: 'xml', - }, - ignore: { - customPatterns: ['**/node_modules/**', '**/dist/**'], - }, -}); -``` - -**CommonJS Example:** - -```javascript -// repomix.config.cjs -module.exports = { - output: { - // Use environment variables - filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', - style: 'xml', - }, - ignore: { - customPatterns: ['**/build/**'], - }, -}; -``` - -### JSON Configuration - -You can also use JSON-based configuration files. Create a `repomix.config.json` file in your project directory: +## Quick Start +Create a configuration file in your project directory: ```bash repomix --init ``` -This will create a `repomix.config.json` file with default settings. - -### Global Configuration - -You can create a global configuration file that will be used as a fallback when no local configuration is found: +This will create a `repomix.config.json` file with default settings. You can also create a global configuration file that will be used as a fallback when no local configuration is found: ```bash repomix --init --global ``` -The global configuration file will be created in: -- Windows: `%LOCALAPPDATA%\Repomix\repomix.config.json` -- macOS/Linux: `$XDG_CONFIG_HOME/repomix/repomix.config.json` or `~/.config/repomix/repomix.config.json` - -Note: Local configuration (if present) takes precedence over global configuration. - ## Configuration Options | Option | Description | Default | diff --git a/website/client/src/ja/guide/configuration.md b/website/client/src/ja/guide/configuration.md index dcc0849ab..e441bb3e4 100644 --- a/website/client/src/ja/guide/configuration.md +++ b/website/client/src/ja/guide/configuration.md @@ -1,115 +1,20 @@ # 設定 -Repomixは設定ファイルまたはコマンドラインオプションを使用して設定できます。設定ファイルを使用することで、コードベースの処理と出力方法をカスタマイズできます。 +Repomixは設定ファイル(`repomix.config.json`)またはコマンドラインオプションを使用して設定できます。設定ファイルを使用することで、コードベースの処理と出力方法をカスタマイズできます。 -## 設定ファイルの形式 - -Repomixは複数の設定ファイル形式をサポートしています。設定ファイルを検索する際、Repomixは以下の優先順位でチェックします: - -1. **TypeScript** (`repomix.config.ts`、`repomix.config.mts`、`repomix.config.cts`) -2. **JavaScript/ES Module** (`repomix.config.js`、`repomix.config.mjs`、`repomix.config.cjs`) -3. **JSON5** (`repomix.config.json5`) -4. **JSONC** (`repomix.config.jsonc`) -5. **JSON** (`repomix.config.json`) - -### TypeScript設定(推奨) - -TypeScript設定ファイルは、完全な型チェックとIDEサポートにより、最高の開発者体験を提供します。 - -**インストール:** - -TypeScriptまたはJavaScript設定で `defineConfig` を使用するには、Repomixを開発用依存関係としてインストールする必要があります: - -```bash -npm install -D repomix -``` - -**例:** - -```typescript -// repomix.config.ts -import { defineConfig } from 'repomix'; - -export default defineConfig({ - output: { - // タイムスタンプなどの動的な値を使用 - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, - style: 'xml', - removeComments: true, - }, - ignore: { - customPatterns: ['**/node_modules/**', '**/dist/**'], - }, -}); -``` - -**メリット:** -- ✅ 完全なTypeScript型チェック -- ✅ 優れたIDE自動補完とIntelliSense -- ✅ コンパイル時のエラー検出 -- ✅ 動的な値(タイムスタンプ、環境変数など)の使用が可能 - -### JavaScript設定 - -JavaScript設定ファイルも動的な値と型サポートを提供します: - -**ES Moduleの例:** - -```javascript -// repomix.config.js -import { defineConfig } from 'repomix'; - -export default defineConfig({ - output: { - filePath: `output-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-')}.xml`, - style: 'xml', - }, - ignore: { - customPatterns: ['**/node_modules/**', '**/dist/**'], - }, -}); -``` - -**CommonJSの例:** - -```javascript -// repomix.config.cjs -module.exports = { - output: { - // 環境変数を使用 - filePath: process.env.CI ? 'ci-output.xml' : 'local-output.xml', - style: 'xml', - }, - ignore: { - customPatterns: ['**/build/**'], - }, -}; -``` - -### JSON設定 - -JSON形式の設定ファイルも使用できます。プロジェクトディレクトリに`repomix.config.json`ファイルを作成します: +## クイックスタート +プロジェクトディレクトリに設定ファイルを作成します: ```bash repomix --init ``` -これにより、デフォルト設定の`repomix.config.json`ファイルが作成されます。 - -### グローバル設定 - -ローカル設定が見つからない場合のフォールバックとして使用されるグローバル設定ファイルを作成できます: +これにより、デフォルト設定の`repomix.config.json`ファイルが作成されます。また、ローカル設定が見つからない場合のフォールバックとして使用されるグローバル設定ファイルを作成することもできます: ```bash repomix --init --global ``` -グローバル設定ファイルは以下の場所に作成されます: -- Windows: `%LOCALAPPDATA%\Repomix\repomix.config.json` -- macOS/Linux: `$XDG_CONFIG_HOME/repomix/repomix.config.json` または `~/.config/repomix/repomix.config.json` - -注:ローカル設定(存在する場合)はグローバル設定よりも優先されます。 - ## 設定オプション | オプション | 説明 | デフォルト値 | From f85692098fe75f95fb87c213f6ab2d93886c3a9f Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:33:36 +0900 Subject: [PATCH 09/16] docs(config): Consolidate JSON format entries in priority list Merged JSON5, JSONC, and JSON entries into a single "JSON" entry to simplify the configuration format list. All three formats are functionally similar and parsed by the same JSON5 parser, so grouping them together reduces redundancy and improves readability. --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c9545dd0..2817a635a 100644 --- a/README.md +++ b/README.md @@ -1003,9 +1003,7 @@ Repomix will automatically search for configuration files in the following prior 1. **TypeScript** (`repomix.config.ts`, `repomix.config.mts`, `repomix.config.cts`) 2. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) -3. **JSON5** (`repomix.config.json5`) -4. **JSONC** (`repomix.config.jsonc`) -5. **JSON** (`repomix.config.json`) +3. **JSON** (`repomix.config.json5`, `repomix.config.jsonc`, `repomix.config.json`) #### TypeScript Configuration (Recommended) From 079ec27d6fab62ea95b4ebe4f73b0c20b0f0dada Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:36:03 +0900 Subject: [PATCH 10/16] refactor(config): Use jiti for both TypeScript and JavaScript config files Unified the configuration loading logic to use jiti for all script-based config files (TS/JS/MJS/CJS). This addresses PR feedback and provides: - Consistent behavior across TypeScript and JavaScript configs - Automatic cache busting with moduleCache: false - Eliminates Node.js module cache issues in long-running processes (MCP server) - Simplifies switch statement by reducing duplicate logic Also added explanatory comments to repomix.config.ts for tokenCountTree option to clarify it accepts both boolean and number values. Addresses PR review comments from @gemini-code-assist and @coderabbitai. --- repomix.config.ts | 2 ++ src/config/configLoad.ts | 21 +++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/repomix.config.ts b/repomix.config.ts index a53d09503..c0a3dc1ad 100644 --- a/repomix.config.ts +++ b/repomix.config.ts @@ -33,6 +33,8 @@ Please refer to the README.md file for more detailed information on usage and co showLineNumbers: false, includeEmptyDirectories: true, truncateBase64: true, + // Display token count tree for files/directories with 50000+ tokens + // Can be boolean (true/false) or number (minimum token threshold) tokenCountTree: 50000, git: { sortByChanges: true, diff --git a/src/config/configLoad.ts b/src/config/configLoad.ts index 56ffd4c55..1f9fa7a35 100644 --- a/src/config/configLoad.ts +++ b/src/config/configLoad.ts @@ -108,27 +108,20 @@ const loadAndValidateConfig = async (filePath: string): Promise Date: Sun, 12 Oct 2025 17:51:40 +0900 Subject: [PATCH 11/16] docs(config): Reorder configuration sections to prioritize JSON Moved JSON Configuration section to appear first after the priority list, before TypeScript and JavaScript sections. This provides a better user experience by showing the simplest configuration method first. Changes: - JSON Configuration now appears immediately after the format priority list - TypeScript Configuration (Recommended) follows JSON section - JavaScript Configuration comes after TypeScript - Removed duplicate JSON Configuration section at the end --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2817a635a..722e28994 100644 --- a/README.md +++ b/README.md @@ -1005,6 +1005,16 @@ Repomix will automatically search for configuration files in the following prior 2. **JavaScript/ES Module** (`repomix.config.js`, `repomix.config.mjs`, `repomix.config.cjs`) 3. **JSON** (`repomix.config.json5`, `repomix.config.jsonc`, `repomix.config.json`) +#### JSON Configuration + +Create a `repomix.config.json` file in your project root: + +```bash +repomix --init +``` + +This will create a `repomix.config.json` file with default settings. + #### TypeScript Configuration (Recommended) TypeScript configuration files provide the best developer experience with full type checking and IDE support. @@ -1108,14 +1118,6 @@ module.exports = { }; ``` -#### JSON Configuration - -Create a `repomix.config.json` file in your project root: - -```bash -repomix --init -``` - ### Configuration Options Here's an explanation of the configuration options: From dc886d9f623e06fb8d549e7fd570faa183a568e9 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:52:28 +0900 Subject: [PATCH 12/16] docs(config): Remove 'Recommended' label from TypeScript section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 722e28994..bf398c94e 100644 --- a/README.md +++ b/README.md @@ -1015,7 +1015,7 @@ repomix --init This will create a `repomix.config.json` file with default settings. -#### TypeScript Configuration (Recommended) +#### TypeScript Configuration TypeScript configuration files provide the best developer experience with full type checking and IDE support. From 4fd64574fda894038d3248103cc569581b194515 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:53:40 +0900 Subject: [PATCH 13/16] docs(config): Simplify JavaScript Configuration section Reduced the JavaScript Configuration section to a single line noting it works the same as TypeScript. Removed redundant examples since the behavior and usage are identical to TypeScript configuration. --- README.md | 48 +----------------------------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/README.md b/README.md index bf398c94e..866317e45 100644 --- a/README.md +++ b/README.md @@ -1070,53 +1070,7 @@ export default defineConfig({ #### JavaScript Configuration -JavaScript configuration files also support dynamic values and type definitions: - -```javascript -// repomix.config.js -import { defineConfig } from 'repomix'; - -export default defineConfig({ - output: { - filePath: 'output.xml', - style: 'xml', - }, - ignore: { - customPatterns: ['**/node_modules/**', '**/dist/**'], - }, -}); -``` - -**Dynamic Values with Environment Variables:** - -```javascript -// repomix.config.js -import { defineConfig } from 'repomix'; - -const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); -const environment = process.env.NODE_ENV || 'development'; - -export default defineConfig({ - output: { - filePath: `output-${environment}-${timestamp}.xml`, - style: 'xml', - }, -}); -``` - -**CommonJS Example:** - -```javascript -// repomix.config.cjs -const timestamp = new Date().toISOString().slice(0, 19).replace(/[:.]/g, '-'); - -module.exports = { - output: { - filePath: `output-${timestamp}.xml`, - style: 'xml', - }, -}; -``` +JavaScript configuration files work the same as TypeScript, supporting `defineConfig` and dynamic values. ### Configuration Options From 4f21d324fabf419b6e7b26c179f3014ad3eb2d48 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 17:57:26 +0900 Subject: [PATCH 14/16] docs(config): Remove duplicate benefit from TypeScript section Removed 'Real-time error detection while editing' as it's redundant with 'Full TypeScript type checking in your IDE' which already implies real-time error detection. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 866317e45..6c0e6d91c 100644 --- a/README.md +++ b/README.md @@ -1048,7 +1048,6 @@ export default defineConfig({ **Benefits:** - ✅ Full TypeScript type checking in your IDE - ✅ Excellent IDE autocomplete and IntelliSense -- ✅ Real-time error detection while editing - ✅ Use dynamic values (timestamps, environment variables, etc.) **Dynamic Values Example:** From ead0235c805999bf9971c0fbb98e1ae459c503f3 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 18:02:33 +0900 Subject: [PATCH 15/16] docs(config): Add schema validation section to README Added documentation for JSON schema validation feature that was present in the website docs but missing from README. Users can now enable auto-completion and validation in their editors by adding the $schema property to their configuration file. --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 6c0e6d91c..7933bddd5 100644 --- a/README.md +++ b/README.md @@ -1113,6 +1113,24 @@ The configuration file supports [JSON5](https://json5.org/) syntax, which allows - Unquoted property names - More relaxed string syntax +### Schema Validation + +You can enable schema validation for your configuration file by adding the `$schema` property: + +```json +{ + "$schema": "https://repomix.com/schemas/latest/schema.json", + "output": { + "filePath": "repomix-output.xml", + "style": "xml" + } +} +``` + +This provides auto-completion and validation in editors that support JSON schema. + +### Example Configuration + Example configuration: ```json5 From 5b707f53a95def30e1efbadc5e3f14905d363c00 Mon Sep 17 00:00:00 2001 From: Kazuki Yamada Date: Sun, 12 Oct 2025 18:04:14 +0900 Subject: [PATCH 16/16] docs(config): Add $schema to example configuration Added $schema property to the example configuration to demonstrate best practice and encourage users to enable schema validation for better IDE support. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7933bddd5..84d68dc4b 100644 --- a/README.md +++ b/README.md @@ -1135,6 +1135,7 @@ Example configuration: ```json5 { + "$schema": "https://repomix.com/schemas/latest/schema.json", "input": { "maxFileSize": 50000000 },