@@ -56,8 +56,12 @@ const defaultMethods = {
5656 if ( typeof data === 'string' ) return + data
5757 if ( typeof data === 'number' ) return + data
5858 if ( typeof data === 'boolean' ) return + data
59+ if ( typeof data === 'object' && ! Array . isArray ( data ) ) return Number . NaN
5960 let res = 0
60- for ( let i = 0 ; i < data . length ; i ++ ) res += + data [ i ]
61+ for ( let i = 0 ; i < data . length ; i ++ ) {
62+ if ( data [ i ] && typeof data [ i ] === 'object' ) return Number . NaN
63+ res += + data [ i ]
64+ }
6165 return res
6266 } ,
6367 '*' : ( data ) => {
@@ -85,6 +89,11 @@ const defaultMethods = {
8589 for ( let i = 1 ; i < data . length ; i ++ ) res %= + data [ i ]
8690 return res
8791 } ,
92+ error : ( type ) => {
93+ if ( Array . isArray ( type ) ) type = type [ 0 ]
94+ if ( type === 'NaN' ) return Number . NaN
95+ return { error : type }
96+ } ,
8897 max : ( data ) => Math . max ( ...data ) ,
8998 min : ( data ) => Math . min ( ...data ) ,
9099 in : ( [ item , array ] ) => ( array || [ ] ) . includes ( item ) ,
@@ -855,9 +864,14 @@ defaultMethods['==='].compile = function (data, buildState) {
855864defaultMethods [ '+' ] . compile = function ( data , buildState ) {
856865 if ( Array . isArray ( data ) ) {
857866 return `(${ data
858- . map ( ( i ) => `(+${ buildString ( i , buildState ) } )` )
867+ . map ( ( i ) => {
868+ // Todo: Actually make this correct, this is a decent optimization but
869+ // does not coerce the built string.
870+ if ( Array . isArray ( i ) ) return 'NaN'
871+ return `(+${ buildString ( i , buildState ) } )`
872+ } )
859873 . join ( ' + ' ) } )`
860- } else if ( typeof data === 'string' || typeof data === 'number' ) {
874+ } else if ( typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean' ) {
861875 return `(+${ buildString ( data , buildState ) } )`
862876 } else {
863877 return `([].concat(${ buildString (
@@ -943,12 +957,12 @@ defaultMethods.not = defaultMethods['!']
943957// @ts -ignore Allow custom attribute
944958defaultMethods [ '!!' ] . compile = function ( data , buildState ) {
945959 if ( Array . isArray ( data ) ) return buildState . compile `(!!engine.truthy(${ data [ 0 ] } ))`
946- return `(!!engine.truthy(${ data } ))`
960+ return buildState . compile `(!!engine.truthy(${ data } ))`
947961}
948962defaultMethods . none . deterministic = defaultMethods . some . deterministic
949963
950964// @ts -ignore Allowing a optimizeUnary attribute that can be used for performance optimizations
951- defaultMethods [ '+' ] . optimizeUnary = defaultMethods [ '-' ] . optimizeUnary = defaultMethods [ '!' ] . optimizeUnary = defaultMethods [ '!!' ] . optimizeUnary = defaultMethods . cat . optimizeUnary = true
965+ defaultMethods [ '+' ] . optimizeUnary = defaultMethods [ '-' ] . optimizeUnary = defaultMethods [ '!' ] . optimizeUnary = defaultMethods [ '!!' ] . optimizeUnary = defaultMethods . cat . optimizeUnary = defaultMethods . error . optimizeUnary = true
952966
953967export default {
954968 ...defaultMethods ,
0 commit comments