@@ -59,27 +59,27 @@ const defaultMethods = {
59
59
if ( typeof data === 'string' ) return + data
60
60
if ( typeof data === 'number' ) return + data
61
61
if ( typeof data === 'boolean' ) return + data
62
- if ( typeof data === 'object' && ! Array . isArray ( data ) ) return Number . NaN
62
+ if ( typeof data === 'object' && ! Array . isArray ( data ) ) throw new Error ( ' NaN' )
63
63
let res = 0
64
64
for ( let i = 0 ; i < data . length ; i ++ ) {
65
- if ( data [ i ] && typeof data [ i ] === 'object' ) return Number . NaN
65
+ if ( data [ i ] && typeof data [ i ] === 'object' ) throw new Error ( ' NaN' )
66
66
res += + data [ i ]
67
67
}
68
68
return res
69
69
} ,
70
70
'*' : ( data ) => {
71
71
let res = 1
72
72
for ( let i = 0 ; i < data . length ; i ++ ) {
73
- if ( data [ i ] && typeof data [ i ] === 'object' ) return Number . NaN
73
+ if ( data [ i ] && typeof data [ i ] === 'object' ) throw new Error ( ' NaN' )
74
74
res *= + data [ i ]
75
75
}
76
76
return res
77
77
} ,
78
78
'/' : ( data ) => {
79
- if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) return Number . NaN
79
+ if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) throw new Error ( ' NaN' )
80
80
let res = + data [ 0 ]
81
81
for ( let i = 1 ; i < data . length ; i ++ ) {
82
- if ( ( data [ i ] && typeof data [ i ] === 'object' ) || ! data [ i ] ) return Number . NaN
82
+ if ( ( data [ i ] && typeof data [ i ] === 'object' ) || ! data [ i ] ) throw new Error ( ' NaN' )
83
83
res /= + data [ i ]
84
84
}
85
85
return res
@@ -89,35 +89,27 @@ const defaultMethods = {
89
89
if ( typeof data === 'string' ) return - data
90
90
if ( typeof data === 'number' ) return - data
91
91
if ( typeof data === 'boolean' ) return - data
92
- if ( typeof data === 'object' && ! Array . isArray ( data ) ) return Number . NaN
93
- if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) return Number . NaN
92
+ if ( typeof data === 'object' && ! Array . isArray ( data ) ) throw new Error ( ' NaN' )
93
+ if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) throw new Error ( ' NaN' )
94
94
if ( data . length === 1 ) return - data [ 0 ]
95
95
let res = data [ 0 ]
96
96
for ( let i = 1 ; i < data . length ; i ++ ) {
97
- if ( data [ i ] && typeof data [ i ] === 'object' ) return Number . NaN
97
+ if ( data [ i ] && typeof data [ i ] === 'object' ) throw new Error ( ' NaN' )
98
98
res -= + data [ i ]
99
99
}
100
100
return res
101
101
} ,
102
102
'%' : ( data ) => {
103
- if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) return Number . NaN
103
+ if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) throw new Error ( ' NaN' )
104
104
let res = + data [ 0 ]
105
105
for ( let i = 1 ; i < data . length ; i ++ ) {
106
- if ( data [ i ] && typeof data [ i ] === 'object' ) return Number . NaN
106
+ if ( data [ i ] && typeof data [ i ] === 'object' ) throw new Error ( ' NaN' )
107
107
res %= + data [ i ]
108
108
}
109
109
return res
110
110
} ,
111
111
error : ( type ) => {
112
- if ( Array . isArray ( type ) ) type = type [ 0 ]
113
- if ( type === 'NaN' ) return Number . NaN
114
- return { error : type }
115
- } ,
116
- panic : ( item ) => {
117
- if ( Array . isArray ( item ) ) item = item [ 0 ]
118
- if ( Number . isNaN ( item ) ) throw new Error ( 'NaN was returned from expression' )
119
- if ( item && item . error ) throw item . error
120
- return item
112
+ throw new Error ( type )
121
113
} ,
122
114
max : ( data ) => Math . max ( ...data ) ,
123
115
min : ( data ) => Math . min ( ...data ) ,
@@ -290,7 +282,52 @@ const defaultMethods = {
290
282
lazy : true
291
283
} ,
292
284
'??' : defineCoalesce ( ) ,
293
- try : defineCoalesce ( downgrade , true ) ,
285
+ try : {
286
+ [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
287
+ method : ( arr , _1 , _2 , engine ) => {
288
+ // See "executeInLoop" above
289
+ const executeInLoop = Array . isArray ( arr )
290
+ if ( ! executeInLoop ) arr = engine . run ( arr , _1 , { above : _2 } )
291
+
292
+ let item
293
+ let lastError
294
+ for ( let i = 0 ; i < arr . length ; i ++ ) {
295
+ try {
296
+ item = executeInLoop ? engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
297
+ return item
298
+ } catch ( e ) {
299
+ // Do nothing
300
+ lastError = e
301
+ }
302
+ }
303
+
304
+ throw lastError
305
+ } ,
306
+ asyncMethod : async ( arr , _1 , _2 , engine ) => {
307
+ // See "executeInLoop" above
308
+ const executeInLoop = Array . isArray ( arr )
309
+ if ( ! executeInLoop ) arr = await engine . run ( arr , _1 , { above : _2 } )
310
+
311
+ let item
312
+ let lastError
313
+ for ( let i = 0 ; i < arr . length ; i ++ ) {
314
+ try {
315
+ item = executeInLoop ? await engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
316
+ return item
317
+ } catch ( e ) {
318
+ // Do nothing
319
+ lastError = e
320
+ }
321
+ }
322
+
323
+ throw lastError
324
+ } ,
325
+ deterministic : ( data , buildState ) => isDeterministic ( data , buildState . engine , buildState ) ,
326
+ compile : ( data , buildState ) => {
327
+ return false
328
+ } ,
329
+ lazy : true
330
+ } ,
294
331
and : {
295
332
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
296
333
method : ( arr , _1 , _2 , engine ) => {
@@ -933,11 +970,11 @@ defaultMethods['/'].compile = function (data, buildState) {
933
970
if ( Array . isArray ( data ) ) {
934
971
return `(${ data . map ( ( i , x ) => {
935
972
let res = numberCoercion ( i , buildState )
936
- if ( x ) res = `(${ res } ||NaN )`
973
+ if ( x ) res = `(${ res } || (() => { throw new Error() })() )`
937
974
return res
938
975
} ) . join ( ' / ' ) } )`
939
976
}
940
- return `(${ buildString ( data , buildState ) } ).reduce((a,b) => (+precoerceNumber(a))/(+precoerceNumber(b) || NaN ))`
977
+ return `(${ buildString ( data , buildState ) } ).reduce((a,b) => (+precoerceNumber(a))/(+precoerceNumber(b) || (() => { throw new Error() })() ))`
941
978
}
942
979
// @ts -ignore Allow custom attribute
943
980
defaultMethods [ '*' ] . compile = function ( data , buildState ) {
@@ -964,7 +1001,7 @@ defaultMethods['!!'].compile = function (data, buildState) {
964
1001
defaultMethods . none . deterministic = defaultMethods . some . deterministic
965
1002
966
1003
// @ts -ignore Allowing a optimizeUnary attribute that can be used for performance optimizations
967
- defaultMethods [ '+' ] . optimizeUnary = defaultMethods [ '-' ] . optimizeUnary = defaultMethods [ '!' ] . optimizeUnary = defaultMethods [ '!!' ] . optimizeUnary = defaultMethods . cat . optimizeUnary = defaultMethods . error . optimizeUnary = defaultMethods . panic . optimizeUnary = true
1004
+ defaultMethods [ '+' ] . optimizeUnary = defaultMethods [ '-' ] . optimizeUnary = defaultMethods [ '!' ] . optimizeUnary = defaultMethods [ '!!' ] . optimizeUnary = defaultMethods . cat . optimizeUnary = defaultMethods . error . optimizeUnary = true
968
1005
969
1006
export default {
970
1007
...defaultMethods ,
0 commit comments