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