@@ -20,7 +20,8 @@ function isDeterministic (method, engine, buildState) {
2020 const lower = method [ func ]
2121
2222 if ( engine . isData ( method , func ) || func === undefined ) return true
23- if ( ! engine . methods [ func ] ) throw new Error ( `Method '${ func } ' was not found in the Logic Engine.` )
23+ // eslint-disable-next-line no-throw-literal
24+ if ( ! engine . methods [ func ] ) throw { type : 'Unknown Operator' , key : func }
2425
2526 if ( engine . methods [ func ] . lazy ) {
2627 return typeof engine . methods [ func ] . deterministic === 'function'
@@ -45,7 +46,8 @@ function isSyncDeep (method, engine, buildState) {
4546 const func = Object . keys ( method ) [ 0 ]
4647 const lower = method [ func ]
4748 if ( engine . isData ( method , func ) || func === undefined ) return true
48- if ( ! engine . methods [ func ] ) throw new Error ( `Method '${ func } ' was not found in the Logic Engine.` )
49+ // eslint-disable-next-line no-throw-literal
50+ if ( ! engine . methods [ func ] ) throw { type : 'Unknown Operator' , key : func }
4951 if ( engine . methods [ func ] . lazy ) return typeof engine . methods [ func ] [ Sync ] === 'function' ? engine . methods [ func ] [ Sync ] ( lower , buildState ) : engine . methods [ func ] [ Sync ]
5052 return typeof engine . methods [ func ] [ Sync ] === 'function' ? engine . methods [ func ] [ Sync ] ( lower , buildState ) : engine . methods [ func ] [ Sync ] && isSyncDeep ( lower , engine , buildState )
5153 }
@@ -147,15 +149,32 @@ const defaultMethods = {
147149 // eslint-disable-next-line no-throw-literal
148150 throw { type }
149151 } ,
150- max : ( data ) => Math . max ( ...data ) ,
151- min : ( data ) => Math . min ( ...data ) ,
152+ max : ( data ) => {
153+ if ( ! data . length || typeof data [ 0 ] !== 'number' ) throw INVALID_ARGUMENTS
154+ let max = data [ 0 ]
155+ for ( let i = 1 ; i < data . length ; i ++ ) {
156+ if ( typeof data [ i ] !== 'number' ) throw INVALID_ARGUMENTS
157+ if ( data [ i ] > max ) max = data [ i ]
158+ }
159+ return max
160+ } ,
161+ min : ( data ) => {
162+ if ( ! data . length || typeof data [ 0 ] !== 'number' ) throw INVALID_ARGUMENTS
163+ let min = data [ 0 ]
164+ for ( let i = 1 ; i < data . length ; i ++ ) {
165+ if ( typeof data [ i ] !== 'number' ) throw INVALID_ARGUMENTS
166+ if ( data [ i ] < min ) min = data [ i ]
167+ }
168+ return min
169+ } ,
152170 in : ( [ item , array ] ) => ( array || [ ] ) . includes ( item ) ,
153171 preserve : {
154172 lazy : true ,
155173 method : declareSync ( ( i ) => i , true ) ,
156174 [ Sync ] : ( ) => true
157175 } ,
158176 if : {
177+ [ OriginalImpl ] : true ,
159178 method : ( input , context , above , engine ) => {
160179 if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
161180
@@ -228,7 +247,7 @@ const defaultMethods = {
228247 [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
229248 method : ( arr , context , above , engine ) => {
230249 if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
231- if ( ! arr . length ) return false
250+ if ( ! arr . length ) return null
232251
233252 let item
234253 for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -240,7 +259,7 @@ const defaultMethods = {
240259 } ,
241260 asyncMethod : async ( arr , _1 , _2 , engine ) => {
242261 if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
243- if ( ! arr . length ) return false
262+ if ( ! arr . length ) return null
244263
245264 let item
246265 for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -254,7 +273,7 @@ const defaultMethods = {
254273 compile : ( data , buildState ) => {
255274 let res = buildState . compile ``
256275 if ( Array . isArray ( data ) ) {
257- if ( ! data . length ) return buildState . compile `false `
276+ if ( ! data . length ) return buildState . compile `null `
258277 for ( let i = 0 ; i < data . length ; i ++ ) res = buildState . compile `${ res } engine.truthy(prev = ${ data [ i ] } ) ? prev : `
259278 res = buildState . compile `${ res } prev`
260279 return res
@@ -386,7 +405,7 @@ const defaultMethods = {
386405 [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
387406 method : ( arr , context , above , engine ) => {
388407 if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
389- if ( ! arr . length ) return false
408+ if ( ! arr . length ) return null
390409
391410 let item
392411 for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -397,7 +416,7 @@ const defaultMethods = {
397416 } ,
398417 asyncMethod : async ( arr , _1 , _2 , engine ) => {
399418 if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
400- if ( ! arr . length ) return false
419+ if ( ! arr . length ) return null
401420 let item
402421 for ( let i = 0 ; i < arr . length ; i ++ ) {
403422 item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
@@ -410,7 +429,7 @@ const defaultMethods = {
410429 compile : ( data , buildState ) => {
411430 let res = buildState . compile ``
412431 if ( Array . isArray ( data ) ) {
413- if ( ! data . length ) return buildState . compile `false `
432+ if ( ! data . length ) return buildState . compile `null `
414433 for ( let i = 0 ; i < data . length ; i ++ ) res = buildState . compile `${ res } !engine.truthy(prev = ${ data [ i ] } ) ? prev : `
415434 res = buildState . compile `${ res } prev`
416435 return res
@@ -866,6 +885,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
866885 } )
867886 )
868887 } ,
888+ [ OriginalImpl ] : true ,
869889 [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
870890 method : ( input , context , above , engine ) => {
871891 if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
@@ -933,21 +953,6 @@ Object.keys(defaultMethods).forEach((item) => {
933953 : defaultMethods [ item ] . deterministic
934954} )
935955
936- // @ts -ignore Allow custom attribute
937- defaultMethods . min . compile = function ( data , buildState ) {
938- if ( ! Array . isArray ( data ) ) return false
939- return `Math.min(${ data
940- . map ( ( i ) => buildString ( i , buildState ) )
941- . join ( ', ' ) } )`
942- }
943- // @ts -ignore Allow custom attribute
944- defaultMethods . max . compile = function ( data , buildState ) {
945- if ( ! Array . isArray ( data ) ) return false
946- return `Math.max(${ data
947- . map ( ( i ) => buildString ( i , buildState ) )
948- . join ( ', ' ) } )`
949- }
950-
951956// @ts -ignore Allow custom attribute
952957defaultMethods . if . compile = function ( data , buildState ) {
953958 if ( ! Array . isArray ( data ) ) return false
0 commit comments