fix: preserve .example key order in merge-config, including nested objects

This commit is contained in:
root
2026-06-07 16:45:05 +02:00
parent ef559ce64b
commit 618615a8b1
+24 -9
View File
@@ -11,15 +11,20 @@ if (!srcFile || !destFile) {
} }
function deepMerge(target, source) { function deepMerge(target, source) {
for (const key of Object.keys(source)) { const result = { ...source };
if (!(key in target)) { for (const key of Object.keys(target)) {
target[key] = source[key]; if (key in source) {
} else if (typeof source[key] === 'object' && !Array.isArray(source[key]) && if (typeof source[key] === 'object' && !Array.isArray(source[key]) &&
typeof target[key] === 'object' && !Array.isArray(target[key])) { typeof target[key] === 'object' && !Array.isArray(target[key])) {
deepMerge(target[key], source[key]); result[key] = deepMerge(target[key], source[key]);
} else {
result[key] = target[key];
}
} else {
result[key] = target[key];
} }
} }
return target; return result;
} }
const srcContent = fs.readFileSync(srcFile, 'utf8'); const srcContent = fs.readFileSync(srcFile, 'utf8');
@@ -49,12 +54,22 @@ if (fs.existsSync(destFile)) {
} }
} }
const merged = deepMerge(destData, srcData); const fullMerged = deepMerge(destData, srcData);
const newKeys = Object.keys(merged).filter(k => !existingKeys.includes(k)); const ordered = {};
for (const key of Object.keys(srcData)) {
ordered[key] = fullMerged[key];
}
for (const key of Object.keys(destData)) {
if (!(key in srcData)) {
ordered[key] = destData[key];
}
}
const newKeys = Object.keys(ordered).filter(k => !existingKeys.includes(k));
if (newKeys.length > 0) { if (newKeys.length > 0) {
console.log(`--> Added ${newKeys.length} new key(s) to ${path.basename(destFile)}`); console.log(`--> Added ${newKeys.length} new key(s) to ${path.basename(destFile)}`);
} }
fs.writeFileSync(destFile, JSON.stringify(merged, null, 4) + '\n'); fs.writeFileSync(destFile, JSON.stringify(ordered, null, 4) + '\n');
console.log(`--> [OK] ${path.basename(destFile)} is up to date`); console.log(`--> [OK] ${path.basename(destFile)} is up to date`);