@@ -25,6 +25,8 @@ function replaceMessage(template: string, kv: Record<string, string>): string {
25
25
} ) ;
26
26
}
27
27
28
+ const CODE_LOGIC_ERROR = 'CODE_LOGIC_ERROR' ;
29
+
28
30
async function validateRule (
29
31
name : string ,
30
32
value : StoreValue ,
@@ -39,6 +41,18 @@ async function validateRule(
39
41
// https://github.com/react-component/field-form/issues/313
40
42
delete ( cloneRule as any ) . ruleIndex ;
41
43
44
+ if ( cloneRule . validator ) {
45
+ const originValidator = cloneRule . validator ;
46
+ cloneRule . validator = ( ...args ) => {
47
+ try {
48
+ return originValidator ( ...args ) ;
49
+ } catch ( error ) {
50
+ console . error ( error ) ;
51
+ return Promise . reject ( CODE_LOGIC_ERROR ) ;
52
+ }
53
+ } ;
54
+ }
55
+
42
56
// We should special handle array validate
43
57
let subRuleField : RuleObject = null ;
44
58
if ( cloneRule && cloneRule . type === 'array' && cloneRule . defaultField ) {
@@ -59,15 +73,14 @@ async function validateRule(
59
73
await Promise . resolve ( validator . validate ( { [ name ] : value } , { ...options } ) ) ;
60
74
} catch ( errObj ) {
61
75
if ( errObj . errors ) {
62
- result = errObj . errors . map ( ( { message } , index ) =>
63
- // Wrap ReactNode with `key`
64
- React . isValidElement ( message )
65
- ? React . cloneElement ( message , { key : `error_${ index } ` } )
66
- : message ,
67
- ) ;
68
- } else {
69
- console . error ( errObj ) ;
70
- result = [ messages . default ] ;
76
+ result = errObj . errors . map ( ( { message } , index : number ) => {
77
+ const mergedMessage = message === CODE_LOGIC_ERROR ? messages . default : message ;
78
+
79
+ return React . isValidElement ( mergedMessage )
80
+ ? // Wrap ReactNode with `key`
81
+ React . cloneElement ( mergedMessage , { key : `error_${ index } ` } )
82
+ : mergedMessage ;
83
+ } ) ;
71
84
}
72
85
}
73
86
0 commit comments