UNPKG

sparkle-design-cli

Version:

Sparkle Design CSS Generator - デザインシステムCSSを設定ファイルから生成するツール

169 lines (145 loc) 5.28 kB
/** * ファイル読み込み機能 * 設定ファイル、テンプレート、カラー定義などの読み込み処理を統一 */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { FILE_NAMES, PATHS, MESSAGES } from './constants.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** * ファイルを読み込む共通関数 * @param {string} filePath ファイルパス * @param {string} successMessage 成功時のメッセージ * @param {string|Function} errorMessage エラー時のメッセージ(文字列 or (error) => string) * @param {Function} additionalErrorHandler 追加のエラーハンドラ(オプション) * @returns {string} ファイル内容 */ function readFile(filePath, successMessage, errorMessage, additionalErrorHandler = null) { try { const content = fs.readFileSync(filePath, 'utf8'); console.log(successMessage); return content; } catch (error) { const message = typeof errorMessage === 'function' ? errorMessage(error) : errorMessage || `❌ ファイルの読み込みに失敗しました: ${error.message}`; console.error(message); if (additionalErrorHandler) { additionalErrorHandler(filePath, error); } process.exit(1); } } /** * JSONファイルを読み込む共通関数 * @param {string} filePath ファイルパス * @param {string} successMessage 成功時のメッセージ * @param {string|Function} errorMessage エラー時のメッセージ(文字列 or (error) => string) * @param {Function} additionalErrorHandler 追加のエラーハンドラ(オプション) * @returns {Object} パース済みのJSONオブジェクト */ function readJsonFile(filePath, successMessage, errorMessage, additionalErrorHandler = null) { const content = readFile(filePath, successMessage, errorMessage, additionalErrorHandler); try { return JSON.parse(content); } catch (error) { const message = typeof errorMessage === 'function' ? errorMessage(error) : errorMessage || `❌ JSONのパースに失敗しました: ${error.message}`; console.error(message); if (additionalErrorHandler) { additionalErrorHandler(filePath, error); } process.exit(1); } } /** * テンプレートディレクトリのパスを取得する * @returns {string} テンプレートディレクトリのパス */ function getTemplateDir() { return path.join(__dirname, '..', ...PATHS.TEMPLATE_DIR); } /** * sparkle.config.jsonを読み込む * @param {string|null} configPath カスタム設定ファイルのパス(オプション) * @returns {Object} 設定オブジェクト */ export function loadConfig(configPath = null) { // カスタムパスが指定されていない場合は実行場所のsparkle.config.jsonを探す const defaultConfigPath = path.resolve(process.cwd(), FILE_NAMES.CONFIG); const resolvedConfigPath = configPath ? path.resolve(configPath) : defaultConfigPath; const config = readJsonFile( resolvedConfigPath, MESSAGES.CONFIG_LOADED(resolvedConfigPath), (error) => MESSAGES.CONFIG_LOAD_FAILED(error.message), (filePath, _error) => { console.error(MESSAGES.CONFIG_PATH_INFO(filePath)); console.error(MESSAGES.CONFIG_HELP); } ); console.log(' 設定内容:', config); return config; } /** * CSSテンプレートを読み込む * @returns {string} テンプレート内容 */ export function loadTemplate() { const templatePath = path.join(getTemplateDir(), FILE_NAMES.TEMPLATE); return readFile( templatePath, MESSAGES.TEMPLATE_LOADED, (error) => MESSAGES.TEMPLATE_LOAD_FAILED(error.message), (filePath) => { console.error(MESSAGES.TEMPLATE_PATH_INFO(filePath)); } ); } /** * 色定義(colors.json)を読み込む * @returns {Object} 色定義オブジェクト */ export function loadColors() { const colorsPath = path.join(getTemplateDir(), FILE_NAMES.COLORS); return readJsonFile(colorsPath, MESSAGES.COLORS_LOADED, (error) => MESSAGES.COLORS_LOAD_FAILED(error.message) ); } /** * gray.jsonを読み込む * @returns {Object} グレーマッピングオブジェクト */ export function loadGrayMapping() { const grayJsonPath = path.join(getTemplateDir(), FILE_NAMES.GRAY); return readJsonFile(grayJsonPath, MESSAGES.GRAY_LOADED, (error) => MESSAGES.GRAY_LOAD_FAILED(error.message) ); } /** * radius.csvを読み込む * @returns {Object} Radiusマッピングオブジェクト */ export function loadRadiusMapping() { const radiusCsvPath = path.join(getTemplateDir(), FILE_NAMES.RADIUS); const csvContent = readFile(radiusCsvPath, MESSAGES.RADIUS_LOADED, (error) => MESSAGES.RADIUS_LOAD_FAILED(error.message) ); // CSVをパース const lines = csvContent.trim().split('\n'); const headers = lines[0].split(','); const radiusMapping = {}; for (let i = 1; i < lines.length; i++) { const values = lines[i].split(','); const name = values[0]; radiusMapping[name] = {}; for (let j = 1; j < headers.length; j++) { radiusMapping[name][headers[j]] = values[j]; } } return radiusMapping; }