@@ -59,27 +59,27 @@ const defaultMethods = {
5959 if ( typeof data === 'string' ) return + data
6060 if ( typeof data === 'number' ) return + data
6161 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' )
6363 let res = 0
6464 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' )
6666 res += + data [ i ]
6767 }
6868 return res
6969 } ,
7070 '*' : ( data ) => {
7171 let res = 1
7272 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' )
7474 res *= + data [ i ]
7575 }
7676 return res
7777 } ,
7878 '/' : ( data ) => {
79- if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) return Number . NaN
79+ if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) throw new Error ( ' NaN' )
8080 let res = + data [ 0 ]
8181 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' )
8383 res /= + data [ i ]
8484 }
8585 return res
@@ -89,35 +89,27 @@ const defaultMethods = {
8989 if ( typeof data === 'string' ) return - data
9090 if ( typeof data === 'number' ) return - data
9191 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' )
9494 if ( data . length === 1 ) return - data [ 0 ]
9595 let res = data [ 0 ]
9696 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' )
9898 res -= + data [ i ]
9999 }
100100 return res
101101 } ,
102102 '%' : ( data ) => {
103- if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) return Number . NaN
103+ if ( data [ 0 ] && typeof data [ 0 ] === 'object' ) throw new Error ( ' NaN' )
104104 let res = + data [ 0 ]
105105 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' )
107107 res %= + data [ i ]
108108 }
109109 return res
110110 } ,
111111 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 )
121113 } ,
122114 max : ( data ) => Math . max ( ...data ) ,
123115 min : ( data ) => Math . min ( ...data ) ,
@@ -290,7 +282,52 @@ const defaultMethods = {
290282 lazy : true
291283 } ,
292284 '??' : 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+ } ,
294331 and : {
295332 [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
296333 method : ( arr , _1 , _2 , engine ) => {
@@ -933,11 +970,11 @@ defaultMethods['/'].compile = function (data, buildState) {
933970 if ( Array . isArray ( data ) ) {
934971 return `(${ data . map ( ( i , x ) => {
935972 let res = numberCoercion ( i , buildState )
936- if ( x ) res = `(${ res } ||NaN )`
973+ if ( x ) res = `(${ res } || (() => { throw new Error() })() )`
937974 return res
938975 } ) . join ( ' / ' ) } )`
939976 }
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() })() ))`
941978}
942979// @ts -ignore Allow custom attribute
943980defaultMethods [ '*' ] . compile = function ( data , buildState ) {
@@ -964,7 +1001,7 @@ defaultMethods['!!'].compile = function (data, buildState) {
9641001defaultMethods . none . deterministic = defaultMethods . some . deterministic
9651002
9661003// @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
9681005
9691006export default {
9701007 ...defaultMethods ,
0 commit comments