mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-14 21:20:48 +08:00
refactor(dns-viewer): use matchAll for name server policy parsing (#7626)
* refactor(dns-viewer): use matchAll for name server policy parsing * chore: biome lint * chore(biome): disable noExplicitAny rule in linter settings
This commit is contained in:
+4
-1
@@ -10,7 +10,10 @@
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true
|
||||
"preset": "recommended",
|
||||
"suspicious": {
|
||||
"noExplicitAny": "off"
|
||||
}
|
||||
}
|
||||
},
|
||||
"formatter": {
|
||||
|
||||
@@ -26,7 +26,12 @@ import {
|
||||
} from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
import { BaseDialog, DialogRef, MonacoEditor, Switch } from '@/components/base'
|
||||
import {
|
||||
BaseDialog,
|
||||
type DialogRef,
|
||||
MonacoEditor,
|
||||
Switch,
|
||||
} from '@/components/base'
|
||||
import { useClash } from '@/hooks/use-clash'
|
||||
import { showNotice } from '@/services/notice-service'
|
||||
import { useThemeMode } from '@/services/states'
|
||||
@@ -49,9 +54,9 @@ function parseNameserverPolicy(str: string): NameserverPolicy {
|
||||
if (!str) return result
|
||||
|
||||
const ruleRegex = /\s*([^=]+?)\s*=\s*([^,]+)(?:,|$)/g
|
||||
let match: RegExpExecArray | null
|
||||
const matchs = [...str.matchAll(ruleRegex)]
|
||||
|
||||
while ((match = ruleRegex.exec(str)) !== null) {
|
||||
matchs.forEach((match) => {
|
||||
const [, domainsPart, serversPart] = match
|
||||
|
||||
const domains = [domainsPart.trim()]
|
||||
@@ -60,7 +65,7 @@ function parseNameserverPolicy(str: string): NameserverPolicy {
|
||||
domains.forEach((domain) => {
|
||||
result[domain] = servers
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -246,15 +251,14 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
hosts: '',
|
||||
})
|
||||
|
||||
// 用于YAML编辑模式, 设置初始化值用于 updateValuesFromYaml 方法判断是否更新表格数据,避免覆盖用户自定义的配置
|
||||
// 用于YAML编辑模式, 初始化标记:阻止 updateValuesFromYaml 在配置加载前误执行
|
||||
const [yamlContent, setYamlContent] = useReducer(
|
||||
(_: string, next: string) => next,
|
||||
'{ isInitValue: true }',
|
||||
)
|
||||
|
||||
// 从配置对象更新表单值
|
||||
const updateValuesFromConfig = useCallback(
|
||||
(config: any) => {
|
||||
const updateValuesFromConfig = useCallback((config: any) => {
|
||||
if (!config) return
|
||||
|
||||
const dnsConfig = config.dns || {}
|
||||
@@ -289,8 +293,7 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
dnsConfig['respect-rules'] ?? DEFAULT_DNS_CONFIG['respect-rules'],
|
||||
useHosts: dnsConfig['use-hosts'] ?? DEFAULT_DNS_CONFIG['use-hosts'],
|
||||
useSystemHosts:
|
||||
dnsConfig['use-system-hosts'] ??
|
||||
DEFAULT_DNS_CONFIG['use-system-hosts'],
|
||||
dnsConfig['use-system-hosts'] ?? DEFAULT_DNS_CONFIG['use-system-hosts'],
|
||||
ipv6: dnsConfig.ipv6 ?? DEFAULT_DNS_CONFIG.ipv6,
|
||||
fakeIpFilter:
|
||||
dnsConfig['fake-ip-filter']?.join(', ') ??
|
||||
@@ -329,9 +332,7 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
formatNameserverPolicy(dnsConfig['nameserver-policy']) || '',
|
||||
hosts: formatHosts(hostsConfig) || '',
|
||||
})
|
||||
},
|
||||
[setValues],
|
||||
)
|
||||
}, [])
|
||||
|
||||
const generateDnsConfig = useCallback(() => {
|
||||
const dnsConfig: any = {
|
||||
@@ -385,7 +386,7 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
}
|
||||
|
||||
setYamlContent(yaml.dump(config, { forceQuotes: true }))
|
||||
}, [generateDnsConfig, setYamlContent, values.hosts])
|
||||
}, [generateDnsConfig, values.hosts])
|
||||
|
||||
// 重置为默认值
|
||||
const resetToDefaults = useCallback(() => {
|
||||
@@ -422,13 +423,13 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
})
|
||||
|
||||
updateYamlFromValues()
|
||||
}, [setValues, updateYamlFromValues])
|
||||
}, [updateYamlFromValues])
|
||||
|
||||
// 从YAML更新表单值
|
||||
const updateValuesFromYaml = useCallback(() => {
|
||||
try {
|
||||
const parsedYaml = yaml.load(yamlContent) as any
|
||||
if (!parsedYaml || parsedYaml['isInitValue']) return
|
||||
if (!parsedYaml || parsedYaml.isInitValue) return
|
||||
|
||||
skipYamlSyncRef.current = true
|
||||
updateValuesFromConfig(parsedYaml)
|
||||
@@ -488,7 +489,7 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
console.error('Failed to initialize DNS config', err)
|
||||
resetToDefaults()
|
||||
}
|
||||
}, [resetToDefaults, setYamlContent, updateValuesFromConfig])
|
||||
}, [resetToDefaults, updateValuesFromConfig])
|
||||
|
||||
useImperativeHandle(
|
||||
ref,
|
||||
|
||||
Reference in New Issue
Block a user