From a46466600c36aaac4e6df6e9d69477e9771ba52f Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Sat, 17 Aug 2024 16:48:38 +0800 Subject: [PATCH] support yaml override --- src/main/config/override.ts | 20 +++++++------ src/main/core/factory.ts | 15 ++++++++-- src/main/utils/dirs.ts | 4 +-- src/main/utils/ipc.ts | 4 +-- src/main/utils/template.ts | 2 +- .../components/override/edit-file-modal.tsx | 13 +++++---- .../src/components/override/override-item.tsx | 29 ++++++++++++------- .../components/profiles/edit-file-modal.tsx | 22 +++++++++++++- .../components/profiles/edit-info-modal.tsx | 9 ++++-- src/renderer/src/pages/dns.tsx | 5 +++- src/renderer/src/pages/override.tsx | 27 +++++++++++++---- src/renderer/src/utils/ipc.ts | 8 ++--- src/shared/types.d.ts | 1 + 13 files changed, 113 insertions(+), 46 deletions(-) diff --git a/src/main/config/override.ts b/src/main/config/override.ts index 536d1c4..a1b528d 100644 --- a/src/main/config/override.ts +++ b/src/main/config/override.ts @@ -48,9 +48,10 @@ export async function addOverrideItem(item: Partial): Promise { const config = await getOverrideConfig() + const item = await getOverrideItem(id) config.items = config.items?.filter((item) => item.id !== id) await setOverrideConfig(config) - await rm(overridePath(id)) + await rm(overridePath(id, item?.ext || 'js')) } export async function createOverride(item: Partial): Promise { @@ -59,6 +60,7 @@ export async function createOverride(item: Partial): Promise): Promise): Promise { - if (!existsSync(overridePath(id))) { - return `function main(config){ return config }` +export async function getOverride(id: string, ext: 'js' | 'yaml'): Promise { + if (!existsSync(overridePath(id, ext))) { + return '' } - return await readFile(overridePath(id), 'utf-8') + return await readFile(overridePath(id, ext), 'utf-8') } -export async function setOverride(id: string, content: string): Promise { - await writeFile(overridePath(id), content, 'utf-8') +export async function setOverride(id: string, ext: 'js' | 'yaml', content: string): Promise { + await writeFile(overridePath(id, ext), content, 'utf-8') } diff --git a/src/main/core/factory.ts b/src/main/core/factory.ts index 518ad35..6d13917 100644 --- a/src/main/core/factory.ts +++ b/src/main/core/factory.ts @@ -3,7 +3,8 @@ import { getProfileConfig, getProfile, getProfileItem, - getOverride + getOverride, + getOverrideItem } from '../config' import { mihomoWorkConfigPath } from '../utils/dirs' import yaml from 'yaml' @@ -24,8 +25,16 @@ async function overrideProfile( ): Promise { const { override = [] } = (await getProfileItem(current)) || {} for (const ov of override) { - const script = await getOverride(ov) - profile = runOverrideScript(profile, script) + const item = await getOverrideItem(ov) + const content = await getOverride(ov, item?.ext || 'js') + switch (item?.ext) { + case 'js': + profile = runOverrideScript(profile, content) + break + case 'yaml': + profile = deepMerge(profile, yaml.parse(content)) + break + } } return profile } diff --git a/src/main/utils/dirs.ts b/src/main/utils/dirs.ts index 6413367..477635b 100644 --- a/src/main/utils/dirs.ts +++ b/src/main/utils/dirs.ts @@ -89,8 +89,8 @@ export function overrideConfigPath(): string { return path.join(dataDir(), 'override.yaml') } -export function overridePath(id: string): string { - return path.join(overrideDir(), `${id}.js`) +export function overridePath(id: string, ext: 'js' | 'yaml'): string { + return path.join(overrideDir(), `${id}.${ext}`) } export function mihomoWorkDir(): string { diff --git a/src/main/utils/ipc.ts b/src/main/utils/ipc.ts index 06df11f..baeaa76 100644 --- a/src/main/utils/ipc.ts +++ b/src/main/utils/ipc.ts @@ -120,8 +120,8 @@ export function registerIpcMainHandlers(): void { ipcMain.handle('addOverrideItem', (_e, item) => ipcErrorWrapper(addOverrideItem)(item)) ipcMain.handle('removeOverrideItem', (_e, id) => ipcErrorWrapper(removeOverrideItem)(id)) ipcMain.handle('updateOverrideItem', (_e, item) => ipcErrorWrapper(updateOverrideItem)(item)) - ipcMain.handle('getOverride', (_e, id) => ipcErrorWrapper(getOverride)(id)) - ipcMain.handle('setOverride', (_e, id, str) => ipcErrorWrapper(setOverride)(id, str)) + ipcMain.handle('getOverride', (_e, id, ext) => ipcErrorWrapper(getOverride)(id, ext)) + ipcMain.handle('setOverride', (_e, id, ext, str) => ipcErrorWrapper(setOverride)(id, ext, str)) ipcMain.handle('restartCore', ipcErrorWrapper(restartCore)) ipcMain.handle('triggerSysProxy', (_e, enable) => ipcErrorWrapper(triggerSysProxy)(enable)) ipcMain.handle('isEncryptionAvailable', isEncryptionAvailable) diff --git a/src/main/utils/template.ts b/src/main/utils/template.ts index 6add14a..6bb874c 100644 --- a/src/main/utils/template.ts +++ b/src/main/utils/template.ts @@ -61,7 +61,7 @@ export const defaultControledMihomoConfig: Partial = { 'use-hosts': false, 'use-system-hosts': false, nameserver: ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query'], - 'proxy-server-nameserver': ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query'], + 'proxy-server-nameserver': ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query'] }, sniffer: { enable: true, diff --git a/src/renderer/src/components/override/edit-file-modal.tsx b/src/renderer/src/components/override/edit-file-modal.tsx index ef4bfc0..3bf7234 100644 --- a/src/renderer/src/components/override/edit-file-modal.tsx +++ b/src/renderer/src/components/override/edit-file-modal.tsx @@ -4,14 +4,15 @@ import { BaseEditor } from '../base/base-editor' import { getOverride, setOverride } from '@renderer/utils/ipc' interface Props { id: string + language: 'javascript' | 'yaml' onClose: () => void } const EditFileModal: React.FC = (props) => { - const { id, onClose } = props + const { id, language, onClose } = props const [currData, setCurrData] = useState('') const getContent = async (): Promise => { - setCurrData(await getOverride(id)) + setCurrData(await getOverride(id, language === 'javascript' ? 'js' : 'yaml')) } useEffect(() => { @@ -28,10 +29,12 @@ const EditFileModal: React.FC = (props) => { scrollBehavior="inside" > - 编辑覆写脚本 + + 编辑覆写{language === 'javascript' ? '脚本' : '配置'} + setCurrData(value)} /> @@ -43,7 +46,7 @@ const EditFileModal: React.FC = (props) => { + 功能 + + + setCurrData(value)} /> diff --git a/src/renderer/src/components/profiles/edit-info-modal.tsx b/src/renderer/src/components/profiles/edit-info-modal.tsx index 8737e07..a6b93da 100644 --- a/src/renderer/src/components/profiles/edit-info-modal.tsx +++ b/src/renderer/src/components/profiles/edit-info-modal.tsx @@ -92,14 +92,19 @@ const EditInfoModal: React.FC = (props) => { )} - + { color="primary" className="ml-2" onPress={() => { - getFilePath(['js']).then(async (files) => { + getFilePath(['js', 'yaml']).then(async (files) => { if (files?.length) { const content = await readTextFile(files[0]) const fileName = files[0].split('/').pop()?.split('\\').pop() - await addOverrideItem({ name: fileName, type: 'local', file: content }) + await addOverrideItem({ + name: fileName, + type: 'local', + file: content, + ext: fileName?.endsWith('.js') ? 'js' : 'yaml' + }) } }) }} diff --git a/src/renderer/src/utils/ipc.ts b/src/renderer/src/utils/ipc.ts index be2088a..d40a617 100644 --- a/src/renderer/src/utils/ipc.ts +++ b/src/renderer/src/utils/ipc.ts @@ -181,12 +181,12 @@ export async function updateOverrideItem(item: IOverrideItem): Promise { return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('updateOverrideItem', item)) } -export async function getOverride(id: string): Promise { - return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('getOverride', id)) +export async function getOverride(id: string, ext: 'js' | 'yaml'): Promise { + return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('getOverride', id, ext)) } -export async function setOverride(id: string, str: string): Promise { - return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('setOverride', id, str)) +export async function setOverride(id: string, ext: 'js' | 'yaml', str: string): Promise { + return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('setOverride', id, ext, str)) } export async function restartCore(): Promise { diff --git a/src/shared/types.d.ts b/src/shared/types.d.ts index 4e98d3c..c5e8a2a 100644 --- a/src/shared/types.d.ts +++ b/src/shared/types.d.ts @@ -331,6 +331,7 @@ interface IProfileConfig { interface IOverrideItem { id: string type: 'remote' | 'local' + ext: 'js' | 'yaml' name: string updated: number url?: string