From e503095baeb06a86327706ca6817924796a68a83 Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Fri, 30 Aug 2024 17:01:33 +0800 Subject: [PATCH] prepend and append array --- changelog.md | 10 ++++++---- src/main/core/factory.ts | 6 ------ src/main/utils/merge.ts | 21 +++++++++++++++++++-- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/changelog.md b/changelog.md index 881c7e0..db4b568 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,7 @@ -### Bug Fixes +### Break Changes -- 修复便携模式无法启动的问题 -- 尝试修复Windows系统代理无法打开的问题 -- 优化Windows程序拉起方式 +- YAML覆写语法有所变动,请更新后参考文档进行修改 + +### New Features + +- YAML覆写功能支持对数组进行覆盖/前置/追加操作 diff --git a/src/main/core/factory.ts b/src/main/core/factory.ts index a60e2e3..36519d5 100644 --- a/src/main/core/factory.ts +++ b/src/main/core/factory.ts @@ -35,12 +35,6 @@ async function overrideProfile( break case 'yaml': { const patch = yaml.parse(content) - if (patch.rules) { - patch.rules = [...patch.rules, ...(profile.rules || [])] - } - if (patch.proxies) { - patch.proxies = [...patch.proxies, ...(profile.proxies || [])] - } profile = deepMerge(profile, patch) break } diff --git a/src/main/utils/merge.ts b/src/main/utils/merge.ts index 262fd58..2d012b3 100644 --- a/src/main/utils/merge.ts +++ b/src/main/utils/merge.ts @@ -6,8 +6,25 @@ function isObject(item: any): boolean { export function deepMerge(target: T, other: Partial): T { for (const key in other) { if (isObject(other[key])) { - if (!target[key]) Object.assign(target, { [key]: {} }) - deepMerge(target[key] as object, other[key] as object) + if (key.endsWith('!')) { + const k = key.slice(0, -1) + target[k] = other[key] + } else { + if (!target[key]) Object.assign(target, { [key]: {} }) + deepMerge(target[key] as object, other[key] as object) + } + } else if (Array.isArray(other[key])) { + if (key.startsWith('+')) { + const k = key.slice(1) + if (!target[k]) Object.assign(target, { [k]: [] }) + target[k] = [...other[key], ...(target[k] as never[])] + } else if (key.endsWith('+')) { + const k = key.slice(0, -1) + if (!target[k]) Object.assign(target, { [k]: [] }) + target[k] = [...(target[k] as never[]), ...other[key]] + } else { + Object.assign(target, { [key]: other[key] }) + } } else { Object.assign(target, { [key]: other[key] }) }