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:
oomeow
2026-07-29 12:37:57 +00:00
committed by GitHub
parent b98c9be7db
commit f69d03c4d4
2 changed files with 90 additions and 86 deletions
+4 -1
View File
@@ -10,7 +10,10 @@
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {
"recommended": true "preset": "recommended",
"suspicious": {
"noExplicitAny": "off"
}
} }
}, },
"formatter": { "formatter": {
+17 -16
View File
@@ -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,