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,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,
|
||||||
|
|||||||
Reference in New Issue
Block a user