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": {
+86 -85
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,92 +251,88 @@ 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 || {}
const hostsConfig = config.hosts || {} const hostsConfig = config.hosts || {}
const enhancedMode = const enhancedMode =
dnsConfig['enhanced-mode'] || DEFAULT_DNS_CONFIG['enhanced-mode'] dnsConfig['enhanced-mode'] || DEFAULT_DNS_CONFIG['enhanced-mode']
const validEnhancedMode = const validEnhancedMode =
enhancedMode === 'fake-ip' || enhancedMode === 'redir-host' enhancedMode === 'fake-ip' || enhancedMode === 'redir-host'
? enhancedMode ? enhancedMode
: DEFAULT_DNS_CONFIG['enhanced-mode'] : DEFAULT_DNS_CONFIG['enhanced-mode']
const fakeIpFilterMode = const fakeIpFilterMode =
dnsConfig['fake-ip-filter-mode'] || dnsConfig['fake-ip-filter-mode'] ||
DEFAULT_DNS_CONFIG['fake-ip-filter-mode'] DEFAULT_DNS_CONFIG['fake-ip-filter-mode']
const validFakeIpFilterMode = const validFakeIpFilterMode =
fakeIpFilterMode === 'blacklist' || fakeIpFilterMode === 'whitelist' fakeIpFilterMode === 'blacklist' || fakeIpFilterMode === 'whitelist'
? fakeIpFilterMode ? fakeIpFilterMode
: DEFAULT_DNS_CONFIG['fake-ip-filter-mode'] : DEFAULT_DNS_CONFIG['fake-ip-filter-mode']
setValues({ setValues({
enable: dnsConfig.enable ?? DEFAULT_DNS_CONFIG.enable, enable: dnsConfig.enable ?? DEFAULT_DNS_CONFIG.enable,
listen: dnsConfig.listen ?? DEFAULT_DNS_CONFIG.listen, listen: dnsConfig.listen ?? DEFAULT_DNS_CONFIG.listen,
enhancedMode: validEnhancedMode, enhancedMode: validEnhancedMode,
fakeIpRange: fakeIpRange:
dnsConfig['fake-ip-range'] ?? DEFAULT_DNS_CONFIG['fake-ip-range'], dnsConfig['fake-ip-range'] ?? DEFAULT_DNS_CONFIG['fake-ip-range'],
fakeIpRange6: fakeIpRange6:
dnsConfig['fake-ip-range6'] ?? DEFAULT_DNS_CONFIG['fake-ip-range6'], dnsConfig['fake-ip-range6'] ?? DEFAULT_DNS_CONFIG['fake-ip-range6'],
fakeIpFilterMode: validFakeIpFilterMode, fakeIpFilterMode: validFakeIpFilterMode,
preferH3: dnsConfig['prefer-h3'] ?? DEFAULT_DNS_CONFIG['prefer-h3'], preferH3: dnsConfig['prefer-h3'] ?? DEFAULT_DNS_CONFIG['prefer-h3'],
respectRules: respectRules:
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(', ') ?? DEFAULT_DNS_CONFIG['fake-ip-filter'].join(', '),
DEFAULT_DNS_CONFIG['fake-ip-filter'].join(', '), nameserver:
nameserver: dnsConfig.nameserver?.join(', ') ??
dnsConfig.nameserver?.join(', ') ?? DEFAULT_DNS_CONFIG.nameserver.join(', '),
DEFAULT_DNS_CONFIG.nameserver.join(', '), fallback:
fallback: dnsConfig.fallback?.join(', ') ??
dnsConfig.fallback?.join(', ') ?? DEFAULT_DNS_CONFIG.fallback.join(', '),
DEFAULT_DNS_CONFIG.fallback.join(', '), defaultNameserver:
defaultNameserver: dnsConfig['default-nameserver']?.join(', ') ??
dnsConfig['default-nameserver']?.join(', ') ?? DEFAULT_DNS_CONFIG['default-nameserver'].join(', '),
DEFAULT_DNS_CONFIG['default-nameserver'].join(', '), proxyServerNameserver:
proxyServerNameserver: dnsConfig['proxy-server-nameserver']?.join(', ') ??
dnsConfig['proxy-server-nameserver']?.join(', ') ?? (DEFAULT_DNS_CONFIG['proxy-server-nameserver']?.join(', ') || ''),
(DEFAULT_DNS_CONFIG['proxy-server-nameserver']?.join(', ') || ''), directNameserver:
directNameserver: dnsConfig['direct-nameserver']?.join(', ') ??
dnsConfig['direct-nameserver']?.join(', ') ?? (DEFAULT_DNS_CONFIG['direct-nameserver']?.join(', ') || ''),
(DEFAULT_DNS_CONFIG['direct-nameserver']?.join(', ') || ''), directNameserverFollowPolicy:
directNameserverFollowPolicy: dnsConfig['direct-nameserver-follow-policy'] ??
dnsConfig['direct-nameserver-follow-policy'] ?? DEFAULT_DNS_CONFIG['direct-nameserver-follow-policy'],
DEFAULT_DNS_CONFIG['direct-nameserver-follow-policy'], fallbackGeoip:
fallbackGeoip: dnsConfig['fallback-filter']?.geoip ??
dnsConfig['fallback-filter']?.geoip ?? DEFAULT_DNS_CONFIG['fallback-filter'].geoip,
DEFAULT_DNS_CONFIG['fallback-filter'].geoip, fallbackGeoipCode:
fallbackGeoipCode: dnsConfig['fallback-filter']?.['geoip-code'] ??
dnsConfig['fallback-filter']?.['geoip-code'] ?? DEFAULT_DNS_CONFIG['fallback-filter']['geoip-code'],
DEFAULT_DNS_CONFIG['fallback-filter']['geoip-code'], fallbackIpcidr:
fallbackIpcidr: dnsConfig['fallback-filter']?.ipcidr?.join(', ') ??
dnsConfig['fallback-filter']?.ipcidr?.join(', ') ?? DEFAULT_DNS_CONFIG['fallback-filter'].ipcidr.join(', '),
DEFAULT_DNS_CONFIG['fallback-filter'].ipcidr.join(', '), fallbackDomain:
fallbackDomain: dnsConfig['fallback-filter']?.domain?.join(', ') ??
dnsConfig['fallback-filter']?.domain?.join(', ') ?? DEFAULT_DNS_CONFIG['fallback-filter'].domain.join(', '),
DEFAULT_DNS_CONFIG['fallback-filter'].domain.join(', '), nameserverPolicy:
nameserverPolicy: 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,