sparkle-design-cli
Version:
Sparkle Design CSS Generator - デザインシステムCSSを設定ファイルから生成するツール
169 lines (145 loc) • 5.28 kB
JavaScript
/**
* ファイル読み込み機能
* 設定ファイル、テンプレート、カラー定義などの読み込み処理を統一
*/
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;
}