const fs = require("node:fs"); const { parse, printParseErrorCode } = require("jsonc-parser"); const exampleFile = process.argv[2]; const targetFile = process.argv[3]; if (!exampleFile || !targetFile) { process.exit(1); } function deepMerge(target, source) { const result = { ...target }; for (const key of Object.keys(source)) { if ( source[key] !== null && typeof source[key] === "object" && !Array.isArray(source[key]) ) { result[key] = deepMerge(target[key] || {}, source[key]); } else { if (!(key in result)) { result[key] = source[key]; } } } return result; } function parseJsonc(file) { if (!fs.existsSync(file)) { return undefined; } const content = fs.readFileSync(file, "utf-8"); const errors = []; const value = parse(content, errors, { allowTrailingComma: true, allowEmptyContent: true, }); if (errors.length > 0) { console.error( `[merge-config] parse error in ${file}: ${errors .map((e) => printParseErrorCode(e.error)) .join(", ")}`, ); return undefined; } return value; } let example; try { example = parseJsonc(exampleFile); } catch { process.exit(1); } if (example === undefined) { process.exit(1); } let current = {}; try { const parsed = parseJsonc(targetFile); if (parsed !== undefined && parsed !== null) { current = parsed; } } catch { current = {}; } const merged = deepMerge(current, example); fs.writeFileSync(targetFile, `${JSON.stringify(merged, null, 4)}\n`);