77 lines
3.2 KiB
JavaScript
77 lines
3.2 KiB
JavaScript
/**
|
||
* generate-process-flowchart.js
|
||
* ------------------------------------------------------------
|
||
* configs/site-{SiteId}_{サイト名}/processes.json と
|
||
* siteSettingJsons/site-{SiteId}_latest.json(Status列ChoicesText)から
|
||
* Mermaid横向きフローチャート(Status遷移図)を生成し、標準出力へ表示します。
|
||
*
|
||
* このスクリプトはファイル書き込み・API送信を一切行いません(標準出力のみ)。
|
||
* 出力された```mermaid```ブロックは、仕様書「8. プロセス設定」節へ手動で組み込んでください。
|
||
*
|
||
* 使い方:
|
||
* node generate-process-flowchart.js site-335411
|
||
* (フォルダ名は "site-{SiteId}_{サイト名}" 形式だが、"site-{SiteId}" だけの
|
||
* 前方一致指定でも configs/ 配下から自動的に該当フォルダを探して解決する)
|
||
* ------------------------------------------------------------
|
||
*/
|
||
|
||
const fs = require("fs");
|
||
const path = require("path");
|
||
|
||
function readJson(p) {
|
||
return JSON.parse(fs.readFileSync(p, "utf-8"));
|
||
}
|
||
|
||
// フォルダ名は "site-{SiteId}_{サイト名}" 形式。"site-{SiteId}" のみの指定でも
|
||
// configs/ 配下から前方一致で該当フォルダを探して解決する。
|
||
// (build-desired-config.js の resolveSiteDir と同一ロジック)
|
||
function resolveSiteDir(baseDir, arg) {
|
||
const configsDir = path.join(baseDir, "configs");
|
||
const direct = path.isAbsolute(arg) ? arg : path.join(configsDir, path.basename(arg));
|
||
const baseName = path.basename(arg);
|
||
|
||
const candidates = fs.existsSync(configsDir)
|
||
? fs.readdirSync(configsDir).filter((name) => {
|
||
const full = path.join(configsDir, name);
|
||
return (
|
||
fs.statSync(full).isDirectory() && (name === baseName || name.startsWith(`${baseName}_`))
|
||
);
|
||
})
|
||
: [];
|
||
|
||
const suffixed = candidates.filter((name) => name !== baseName);
|
||
if (suffixed.length === 1) return path.join(configsDir, suffixed[0]);
|
||
if (suffixed.length > 1) {
|
||
console.error(`[エラー] "${baseName}" に一致するフォルダが複数見つかりました: ${suffixed.join(", ")}`);
|
||
console.error("フォルダ名をフルで指定してください。");
|
||
process.exit(1);
|
||
}
|
||
|
||
if (candidates.includes(baseName)) return path.join(configsDir, baseName);
|
||
if (fs.existsSync(direct) && fs.statSync(direct).isDirectory()) return direct;
|
||
|
||
console.error(`[エラー] フォルダが見つかりません: ${direct}`);
|
||
console.error("先に node extract-site-config.js(またはnode get-site-config.js)を実行してください。");
|
||
process.exit(1);
|
||
}
|
||
|
||
// "値,ラベル,短縮ラベル,色" 形式(改行区切り)のChoicesTextを 値→ラベル のMapへ変換する
|
||
function parseChoicesText(choicesText) {
|
||
const map = new Map();
|
||
if (!choicesText) return map;
|
||
const lines = choicesText.split("\n").filter((line) => line.trim().length > 0);
|
||
for (const line of lines) {
|
||
const parts = line.split(",");
|
||
const value = (parts[0] || "").trim();
|
||
if (!value) continue;
|
||
const label = (parts[1] || value).trim();
|
||
map.set(value, label);
|
||
}
|
||
return map;
|
||
}
|
||
|
||
module.exports = {
|
||
resolveSiteDir,
|
||
parseChoicesText,
|
||
};
|