11import { Input , useFormState } from '@douyinfe/semi-ui' ;
2- import { useDebounceEffect , useGetState } from 'ahooks' ;
2+ import { useDebounceEffect } from 'ahooks' ;
3+ import equal from 'fast-deep-equal' ;
4+ import { cloneDeep } from 'lodash-es' ;
35import { RE2JS } from 're2js' ;
46import { useRef , useState } from 'react' ;
57import { IS_MATCH } from '@/share/core/constant' ;
6- import { initRule , isMatchUrl } from '@/share/core/rule-utils' ;
8+ import { detectRunner , initRule , isMatchUrl } from '@/share/core/rule-utils' ;
79import type { InitdRule } from '@/share/core/types' ;
810import { t } from '@/share/core/utils' ;
11+ import useStateIfChanged from '@/share/hooks/use-state-if-changed' ;
912import { getRuleFromInput } from '../utils' ;
1013
1114const Test = ( ) => {
1215 const rule = useRef < InitdRule > ( ) ;
1316 const lastValue = useRef < any > ( ) ;
1417 const { values } = useFormState ( ) ;
1518 const [ url , setUrl ] = useState ( '' ) ;
16- const [ result , setResult , getResult ] = useGetState ( '' ) ;
19+ const [ result , setResult ] = useStateIfChanged ( '' ) ;
1720
1821 useDebounceEffect (
1922 ( ) => {
2023 if ( url === '' ) {
21- if ( getResult ( ) !== '' ) {
22- setResult ( '' ) ;
23- }
24+ setResult ( '' ) ;
2425 return ;
2526 }
2627
27- if ( lastValue . current !== values || ! rule . current ) {
28+ if ( ! equal ( lastValue . current , values ) || ! rule . current ) {
2829 const ruleContent = getRuleFromInput ( values ) ;
2930 try {
31+ rule . current = initRule ( ruleContent , true ) ;
3032 if ( ruleContent . condition ?. regex ) {
3133 // check re2 syntax
32- RE2JS . compile ( ruleContent . condition . regex ) ;
34+ rule . current . _re2 = RE2JS . compile ( ruleContent . condition . regex ) ;
3335 }
34- rule . current = initRule ( ruleContent , true ) ;
3536 } catch ( e ) {
3637 // 出错
3738 setResult ( ( e as Error ) . message ) ;
3839 return ;
3940 }
41+ lastValue . current = cloneDeep ( values ) ;
4042 }
4143 if ( ! rule . current ) {
4244 return ;
@@ -61,7 +63,9 @@ const Test = () => {
6163 // 只有重定向支持测试详细功能,其他只返回匹配
6264 if ( initdRule . ruleType === 'redirect' && initdRule . to ) {
6365 let redirect = '' ;
64- if ( initdRule ?. _reg ) {
66+ if ( detectRunner ( initdRule ) === 'dnr' && initdRule . _re2 && ENABLE_DNR ) {
67+ redirect = initdRule . _re2 . matcher ( url ) . replaceAll ( initdRule . to ) ;
68+ } else if ( initdRule ?. _reg ) {
6569 initdRule . _reg . lastIndex = 0 ;
6670 redirect = url . replace ( initdRule . _reg , initdRule . to ) ;
6771 } else {
0 commit comments