UNPKG

@shutootaki/gwm

Version:
122 lines 4.04 kB
import { readFileSync, existsSync } from 'fs'; import { execSync } from 'child_process'; import { join } from 'path'; import { DEFAULT_CONFIG, getConfigPaths } from './defaults.js'; import { parseTOML, parseConfigFromTOML } from './parser.js'; import { deepMerge } from './merger.js'; import { isTestEnvironment } from '../utils/common/index.js'; // キャッシュされた設定 let _cachedConfig; /** * Git リポジトリのルートディレクトリを取得 * @returns リポジトリルートのパス、またはリポジトリ外なら null */ export function tryGetRepoRoot() { try { return execSync('git rev-parse --show-toplevel', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], }).trim(); } catch { return null; } } /** * プロジェクト設定ファイルのパスを取得 * @returns プロジェクト設定パス、またはリポジトリ外なら null */ export function getProjectConfigPath() { const repoRoot = tryGetRepoRoot(); if (!repoRoot) { return null; } return join(repoRoot, 'gwm', 'config.toml'); } /** * グローバル設定ファイルを読み込む */ function loadGlobalConfig() { const configPaths = getConfigPaths(); for (const configPath of configPaths) { if (existsSync(configPath)) { try { const content = readFileSync(configPath, 'utf8'); const parsed = parseTOML(content); return parseConfigFromTOML(parsed); } catch (error) { console.error(`Error reading config file ${configPath}:`, error); continue; } } } return { ...DEFAULT_CONFIG }; } /** * プロジェクト設定ファイルを読み込む */ function loadProjectConfig() { const projectConfigPath = getProjectConfigPath(); if (!projectConfigPath || !existsSync(projectConfigPath)) { return null; } try { const content = readFileSync(projectConfigPath, 'utf8'); const parsed = parseTOML(content); return parseConfigFromTOML(parsed); } catch (error) { console.error(`Error reading project config file ${projectConfigPath}:`, error); return null; } } /** * 設定ファイルから設定を読み込む(マージ対応) */ function loadConfigFromFile() { const globalConfig = loadGlobalConfig(); const projectConfig = loadProjectConfig(); return deepMerge(globalConfig, projectConfig); } /** * 設定を読み込む * @param forceReload true にするとキャッシュを無視して再読込する */ export function loadConfig(forceReload = false) { // Vitest や Jest 実行時はキャッシュを無効化する(forceReload でも上書き可能) const isTestEnv = isTestEnvironment(); if (!forceReload && _cachedConfig && !isTestEnv) { return _cachedConfig; } _cachedConfig = loadConfigFromFile(); return _cachedConfig; } /** * テスト用: キャッシュをクリア */ export function __resetConfigCache() { _cachedConfig = undefined; } /** * 設定をソース情報付きで読み込む * 信頼確認のために、プロジェクト設定にhooksが含まれるかを判定する */ export function loadConfigWithSource() { const repoRoot = tryGetRepoRoot(); const globalConfig = loadGlobalConfig(); const projectConfig = loadProjectConfig(); const projectConfigPath = getProjectConfigPath(); // プロジェクト設定にhooksが含まれるかどうかを判定 const hasProjectHooks = !!(projectConfig?.hooks?.post_create?.commands?.length && projectConfig?.hooks?.post_create?.enabled !== false); return { config: deepMerge(globalConfig, projectConfig), hasProjectHooks, projectConfigPath: projectConfigPath && existsSync(projectConfigPath) ? projectConfigPath : null, repoRoot, }; } //# sourceMappingURL=loader.js.map