48 lines
1.2 KiB
JavaScript
48 lines
1.2 KiB
JavaScript
const fs = require('fs');
|
|
const JSON5 = require('json5');
|
|
|
|
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;
|
|
}
|
|
|
|
let example;
|
|
try {
|
|
const content = fs.readFileSync(exampleFile, 'utf-8');
|
|
example = JSON5.parse(content);
|
|
} catch {
|
|
process.exit(1);
|
|
}
|
|
|
|
let current = {};
|
|
try {
|
|
if (fs.existsSync(targetFile)) {
|
|
const content = fs.readFileSync(targetFile, 'utf-8');
|
|
current = JSON5.parse(content);
|
|
}
|
|
} catch {
|
|
current = {};
|
|
}
|
|
|
|
const merged = deepMerge(current, example);
|
|
|
|
const isJson5 = targetFile.endsWith('.json5');
|
|
const output = isJson5 ? JSON5.stringify(merged, null, 4) : JSON.stringify(merged, null, 4);
|
|
fs.writeFileSync(targetFile, output + '\n');
|