@@ -20,7 +20,8 @@ function isDeterministic (method, engine, buildState) {
20
20
const lower = method [ func ]
21
21
22
22
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 }
24
25
25
26
if ( engine . methods [ func ] . lazy ) {
26
27
return typeof engine . methods [ func ] . deterministic === 'function'
@@ -45,7 +46,8 @@ function isSyncDeep (method, engine, buildState) {
45
46
const func = Object . keys ( method ) [ 0 ]
46
47
const lower = method [ func ]
47
48
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 }
49
51
if ( engine . methods [ func ] . lazy ) return typeof engine . methods [ func ] [ Sync ] === 'function' ? engine . methods [ func ] [ Sync ] ( lower , buildState ) : engine . methods [ func ] [ Sync ]
50
52
return typeof engine . methods [ func ] [ Sync ] === 'function' ? engine . methods [ func ] [ Sync ] ( lower , buildState ) : engine . methods [ func ] [ Sync ] && isSyncDeep ( lower , engine , buildState )
51
53
}
@@ -147,15 +149,32 @@ const defaultMethods = {
147
149
// eslint-disable-next-line no-throw-literal
148
150
throw { type }
149
151
} ,
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
+ } ,
152
170
in : ( [ item , array ] ) => ( array || [ ] ) . includes ( item ) ,
153
171
preserve : {
154
172
lazy : true ,
155
173
method : declareSync ( ( i ) => i , true ) ,
156
174
[ Sync ] : ( ) => true
157
175
} ,
158
176
if : {
177
+ [ OriginalImpl ] : true ,
159
178
method : ( input , context , above , engine ) => {
160
179
if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
161
180
@@ -228,7 +247,7 @@ const defaultMethods = {
228
247
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
229
248
method : ( arr , context , above , engine ) => {
230
249
if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
231
- if ( ! arr . length ) return false
250
+ if ( ! arr . length ) return null
232
251
233
252
let item
234
253
for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -240,7 +259,7 @@ const defaultMethods = {
240
259
} ,
241
260
asyncMethod : async ( arr , _1 , _2 , engine ) => {
242
261
if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
243
- if ( ! arr . length ) return false
262
+ if ( ! arr . length ) return null
244
263
245
264
let item
246
265
for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -254,7 +273,7 @@ const defaultMethods = {
254
273
compile : ( data , buildState ) => {
255
274
let res = buildState . compile ``
256
275
if ( Array . isArray ( data ) ) {
257
- if ( ! data . length ) return buildState . compile `false `
276
+ if ( ! data . length ) return buildState . compile `null `
258
277
for ( let i = 0 ; i < data . length ; i ++ ) res = buildState . compile `${ res } engine.truthy(prev = ${ data [ i ] } ) ? prev : `
259
278
res = buildState . compile `${ res } prev`
260
279
return res
@@ -386,7 +405,7 @@ const defaultMethods = {
386
405
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
387
406
method : ( arr , context , above , engine ) => {
388
407
if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
389
- if ( ! arr . length ) return false
408
+ if ( ! arr . length ) return null
390
409
391
410
let item
392
411
for ( let i = 0 ; i < arr . length ; i ++ ) {
@@ -397,7 +416,7 @@ const defaultMethods = {
397
416
} ,
398
417
asyncMethod : async ( arr , _1 , _2 , engine ) => {
399
418
if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
400
- if ( ! arr . length ) return false
419
+ if ( ! arr . length ) return null
401
420
let item
402
421
for ( let i = 0 ; i < arr . length ; i ++ ) {
403
422
item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
@@ -410,7 +429,7 @@ const defaultMethods = {
410
429
compile : ( data , buildState ) => {
411
430
let res = buildState . compile ``
412
431
if ( Array . isArray ( data ) ) {
413
- if ( ! data . length ) return buildState . compile `false `
432
+ if ( ! data . length ) return buildState . compile `null `
414
433
for ( let i = 0 ; i < data . length ; i ++ ) res = buildState . compile `${ res } !engine.truthy(prev = ${ data [ i ] } ) ? prev : `
415
434
res = buildState . compile `${ res } prev`
416
435
return res
@@ -866,6 +885,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
866
885
} )
867
886
)
868
887
} ,
888
+ [ OriginalImpl ] : true ,
869
889
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
870
890
method : ( input , context , above , engine ) => {
871
891
if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
@@ -933,21 +953,6 @@ Object.keys(defaultMethods).forEach((item) => {
933
953
: defaultMethods [ item ] . deterministic
934
954
} )
935
955
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
-
951
956
// @ts -ignore Allow custom attribute
952
957
defaultMethods . if . compile = function ( data , buildState ) {
953
958
if ( ! Array . isArray ( data ) ) return false
0 commit comments