From 618615a8b1601344bb2fc65674263fabd7fd1e22 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 7 Jun 2026 16:45:05 +0200 Subject: [PATCH] fix: preserve .example key order in merge-config, including nested objects --- scripts/merge-config.cjs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/scripts/merge-config.cjs b/scripts/merge-config.cjs index 8889a75..7369ea1 100644 --- a/scripts/merge-config.cjs +++ b/scripts/merge-config.cjs @@ -11,15 +11,20 @@ if (!srcFile || !destFile) { } function deepMerge(target, source) { - for (const key of Object.keys(source)) { - if (!(key in target)) { - target[key] = source[key]; - } else if (typeof source[key] === 'object' && !Array.isArray(source[key]) && - typeof target[key] === 'object' && !Array.isArray(target[key])) { - deepMerge(target[key], source[key]); + const result = { ...source }; + for (const key of Object.keys(target)) { + if (key in source) { + if (typeof source[key] === 'object' && !Array.isArray(source[key]) && + typeof target[key] === 'object' && !Array.isArray(target[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'); @@ -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) { 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`);