@@ -6,7 +6,6 @@ import { Sync, isSync, Unfound, OriginalImpl, Compiled } from './constants.js'
6
6
import declareSync from './utilities/declareSync.js'
7
7
import { build , buildString } from './compiler.js'
8
8
import chainingSupported from './utilities/chainingSupported.js'
9
- import InvalidControlInput from './errors/InvalidControlInput.js'
10
9
import legacyMethods from './legacy.js'
11
10
import { precoerceNumber } from './utilities/downgrade.js'
12
11
@@ -158,7 +157,7 @@ const defaultMethods = {
158
157
} ,
159
158
if : {
160
159
method : ( input , context , above , engine ) => {
161
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
160
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
162
161
163
162
if ( input . length === 1 ) return runOptimizedOrFallback ( input [ 0 ] , engine , context , above )
164
163
if ( input . length < 2 ) return null
@@ -187,7 +186,7 @@ const defaultMethods = {
187
186
return isDeterministic ( data , buildState . engine , buildState )
188
187
} ,
189
188
asyncMethod : async ( input , context , above , engine ) => {
190
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
189
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
191
190
192
191
// check the bounds
193
192
if ( input . length === 1 ) return engine . run ( input [ 0 ] , context , { above } )
@@ -225,31 +224,25 @@ const defaultMethods = {
225
224
// eslint-disable-next-line eqeqeq
226
225
'!=' : createComparator ( '!=' , ( a , b ) => a != b ) ,
227
226
'!==' : createComparator ( '!==' , ( a , b ) => a !== b ) ,
228
- // Why "executeInLoop"? Because if it needs to execute to get an array, I do not want to execute the arguments,
229
- // Both for performance and safety reasons.
230
227
or : {
231
228
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
232
229
method : ( arr , context , above , engine ) => {
233
- // See "executeInLoop" above
234
- const executeInLoop = Array . isArray ( arr )
235
- if ( ! executeInLoop ) arr = runOptimizedOrFallback ( arr , engine , context , above )
230
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
236
231
237
232
let item
238
233
for ( let i = 0 ; i < arr . length ; i ++ ) {
239
- item = executeInLoop ? runOptimizedOrFallback ( arr [ i ] , engine , context , above ) : arr [ i ]
234
+ item = runOptimizedOrFallback ( arr [ i ] , engine , context , above )
240
235
if ( engine . truthy ( item ) ) return item
241
236
}
242
237
243
238
return item
244
239
} ,
245
240
asyncMethod : async ( arr , _1 , _2 , engine ) => {
246
- // See "executeInLoop" above
247
- const executeInLoop = Array . isArray ( arr )
248
- if ( ! executeInLoop ) arr = await engine . run ( arr , _1 , { above : _2 } )
241
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
249
242
250
243
let item
251
244
for ( let i = 0 ; i < arr . length ; i ++ ) {
252
- item = executeInLoop ? await engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
245
+ item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
253
246
if ( engine . truthy ( item ) ) return item
254
247
}
255
248
@@ -270,27 +263,23 @@ const defaultMethods = {
270
263
'??' : {
271
264
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
272
265
method : ( arr , context , above , engine ) => {
273
- // See "executeInLoop" above
274
- const executeInLoop = Array . isArray ( arr )
275
- if ( ! executeInLoop ) arr = runOptimizedOrFallback ( arr , engine , context , above )
266
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
276
267
277
268
let item
278
269
for ( let i = 0 ; i < arr . length ; i ++ ) {
279
- item = executeInLoop ? runOptimizedOrFallback ( arr [ i ] , engine , context , above ) : arr [ i ]
270
+ item = runOptimizedOrFallback ( arr [ i ] , engine , context , above )
280
271
if ( item !== null && item !== undefined ) return item
281
272
}
282
273
283
274
if ( item === undefined ) return null
284
275
return item
285
276
} ,
286
277
asyncMethod : async ( arr , _1 , _2 , engine ) => {
287
- // See "executeInLoop" above
288
- const executeInLoop = Array . isArray ( arr )
289
- if ( ! executeInLoop ) arr = await engine . run ( arr , _1 , { above : _2 } )
278
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
290
279
291
280
let item
292
281
for ( let i = 0 ; i < arr . length ; i ++ ) {
293
- item = executeInLoop ? await engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
282
+ item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
294
283
if ( item !== null && item !== undefined ) return item
295
284
}
296
285
@@ -315,17 +304,15 @@ const defaultMethods = {
315
304
try : {
316
305
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
317
306
method : ( arr , context , above , engine ) => {
318
- // See "executeInLoop" above
319
- const executeInLoop = Array . isArray ( arr )
320
- if ( ! executeInLoop ) arr = runOptimizedOrFallback ( arr , engine , context , above )
307
+ if ( ! Array . isArray ( arr ) ) arr = [ arr ]
321
308
322
309
let item
323
310
let lastError
324
311
for ( let i = 0 ; i < arr . length ; i ++ ) {
325
312
try {
326
313
// Todo: make this message thing more robust.
327
314
if ( lastError ) item = runOptimizedOrFallback ( arr [ i ] , engine , { type : lastError . type || lastError . error || lastError . message || lastError . constructor . name } , [ null , context , above ] )
328
- else item = executeInLoop ? runOptimizedOrFallback ( arr [ i ] , engine , context , above ) : arr [ i ]
315
+ else item = runOptimizedOrFallback ( arr [ i ] , engine , context , above )
329
316
return item
330
317
} catch ( e ) {
331
318
if ( Number . isNaN ( e ) ) lastError = { message : 'NaN' }
@@ -336,17 +323,15 @@ const defaultMethods = {
336
323
throw lastError
337
324
} ,
338
325
asyncMethod : async ( arr , _1 , _2 , engine ) => {
339
- // See "executeInLoop" above
340
- const executeInLoop = Array . isArray ( arr )
341
- if ( ! executeInLoop ) arr = await engine . run ( arr , _1 , { above : _2 } )
326
+ if ( ! Array . isArray ( arr ) ) arr = [ arr ]
342
327
343
328
let item
344
329
let lastError
345
330
for ( let i = 0 ; i < arr . length ; i ++ ) {
346
331
try {
347
332
// Todo: make this message thing more robust.
348
333
if ( lastError ) item = await engine . run ( arr [ i ] , { type : lastError . type || lastError . error || lastError . message || lastError . constructor . name } , { above : [ null , _1 , _2 ] } )
349
- else item = executeInLoop ? await engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
334
+ else item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
350
335
return item
351
336
} catch ( e ) {
352
337
if ( Number . isNaN ( e ) ) lastError = { message : 'NaN' }
@@ -397,25 +382,21 @@ const defaultMethods = {
397
382
and : {
398
383
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
399
384
method : ( arr , context , above , engine ) => {
400
- // See "executeInLoop" above
401
- const executeInLoop = Array . isArray ( arr )
402
- if ( ! executeInLoop ) arr = runOptimizedOrFallback ( arr , engine , context , above )
385
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
403
386
404
387
let item
405
388
for ( let i = 0 ; i < arr . length ; i ++ ) {
406
- item = executeInLoop ? runOptimizedOrFallback ( arr [ i ] , engine , context , above ) : arr [ i ]
389
+ item = runOptimizedOrFallback ( arr [ i ] , engine , context , above )
407
390
if ( ! engine . truthy ( item ) ) return item
408
391
}
409
392
return item
410
393
} ,
411
394
asyncMethod : async ( arr , _1 , _2 , engine ) => {
412
- // See "executeInLoop" above
413
- const executeInLoop = Array . isArray ( arr )
414
- if ( ! executeInLoop ) arr = await engine . run ( arr , _1 , { above : _2 } )
395
+ if ( ! Array . isArray ( arr ) ) throw INVALID_ARGUMENTS
415
396
416
397
let item
417
398
for ( let i = 0 ; i < arr . length ; i ++ ) {
418
- item = executeInLoop ? await engine . run ( arr [ i ] , _1 , { above : _2 } ) : arr [ i ]
399
+ item = await engine . run ( arr [ i ] , _1 , { above : _2 } )
419
400
if ( ! engine . truthy ( item ) ) return item
420
401
}
421
402
return item
@@ -539,7 +520,7 @@ const defaultMethods = {
539
520
some : {
540
521
...createArrayIterativeMethod ( 'some' , true ) ,
541
522
method : ( input , context , above , engine ) => {
542
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
523
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
543
524
let [ selector , mapper ] = input
544
525
545
526
selector = runOptimizedOrFallback ( selector , engine , context , above ) || [ ]
@@ -553,12 +534,11 @@ const defaultMethods = {
553
534
all : {
554
535
[ Sync ] : oldAll [ Sync ] ,
555
536
method : ( args , context , above , engine ) => {
556
- if ( Array . isArray ( args ) ) {
557
- const first = runOptimizedOrFallback ( args [ 0 ] , engine , context , above )
558
- if ( Array . isArray ( first ) && first . length === 0 ) return false
559
- }
560
- let [ selector , mapper ] = args
561
- selector = runOptimizedOrFallback ( selector , engine , context , above ) || [ ]
537
+ if ( ! Array . isArray ( args ) ) throw INVALID_ARGUMENTS
538
+ const selector = runOptimizedOrFallback ( args [ 0 ] , engine , context , above ) || [ ]
539
+ if ( Array . isArray ( selector ) && selector . length === 0 ) return false
540
+
541
+ const mapper = args [ 1 ]
562
542
563
543
for ( let i = 0 ; i < selector . length ; i ++ ) {
564
544
if ( ! engine . truthy ( runOptimizedOrFallback ( mapper , engine , selector [ i ] , [ selector , context , above ] ) ) ) return false
@@ -613,7 +593,7 @@ const defaultMethods = {
613
593
)
614
594
} ,
615
595
compile : ( data , buildState ) => {
616
- if ( ! Array . isArray ( data ) ) throw new InvalidControlInput ( data )
596
+ if ( ! Array . isArray ( data ) ) throw INVALID_ARGUMENTS
617
597
const { async } = buildState
618
598
let [ selector , mapper , defaultValue ] = data
619
599
selector = buildString ( selector , buildState )
@@ -652,7 +632,7 @@ const defaultMethods = {
652
632
} ]({ accumulator: a, current: b }, ${ aboveArray } ))`
653
633
} ,
654
634
method : ( input , context , above , engine ) => {
655
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
635
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
656
636
let [ selector , mapper , defaultValue ] = input
657
637
defaultValue = runOptimizedOrFallback ( defaultValue , engine , context , above )
658
638
selector = runOptimizedOrFallback ( selector , engine , context , above ) || [ ]
@@ -669,7 +649,7 @@ const defaultMethods = {
669
649
} ,
670
650
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
671
651
asyncMethod : async ( input , context , above , engine ) => {
672
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
652
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
673
653
let [ selector , mapper , defaultValue ] = input
674
654
defaultValue = await engine . run ( defaultValue , context , {
675
655
above
@@ -771,7 +751,7 @@ const defaultMethods = {
771
751
return isDeterministic ( i , buildState . engine , buildState )
772
752
} )
773
753
}
774
- throw new InvalidControlInput ( data )
754
+ throw INVALID_ARGUMENTS
775
755
} ,
776
756
compile : ( data , buildState ) => {
777
757
// what's nice about this is that I don't have to worry about whether it's async or not, the lower entries take care of that ;)
@@ -788,7 +768,7 @@ const defaultMethods = {
788
768
. join ( ',' ) } })`
789
769
return result
790
770
}
791
- throw new InvalidControlInput ( data )
771
+ throw INVALID_ARGUMENTS
792
772
} ,
793
773
asyncMethod : async ( object , context , above , engine ) => {
794
774
const result = await asyncIterators . reduce (
@@ -812,13 +792,7 @@ function createComparator (name, func) {
812
792
const opStr = { [ Compiled ] : name }
813
793
return {
814
794
method : ( args , context , above , engine ) => {
815
- if ( ! Array . isArray ( args ) ) {
816
- const items = runOptimizedOrFallback ( args , engine , context , above )
817
- if ( items . length === 2 ) return func ( items [ 0 ] , items [ 1 ] )
818
- for ( let i = 1 ; i < items . length ; i ++ ) {
819
- if ( ! func ( items [ i - 1 ] , items [ i ] ) ) return false
820
- }
821
- }
795
+ if ( ! Array . isArray ( args ) ) throw INVALID_ARGUMENTS
822
796
if ( args . length === 2 ) return func ( runOptimizedOrFallback ( args [ 0 ] , engine , context , above ) , runOptimizedOrFallback ( args [ 1 ] , engine , context , above ) )
823
797
let prev = runOptimizedOrFallback ( args [ 0 ] , engine , context , above )
824
798
for ( let i = 1 ; i < args . length ; i ++ ) {
@@ -829,13 +803,7 @@ function createComparator (name, func) {
829
803
return true
830
804
} ,
831
805
asyncMethod : async ( args , context , above , engine ) => {
832
- if ( ! Array . isArray ( args ) ) {
833
- const items = await runOptimizedOrFallback ( args , engine , context , above )
834
- if ( items . length === 2 ) return func ( items [ 0 ] , items [ 1 ] )
835
- for ( let i = 1 ; i < items . length ; i ++ ) {
836
- if ( ! func ( items [ i - 1 ] , items [ i ] ) ) return false
837
- }
838
- }
806
+ if ( ! Array . isArray ( args ) ) throw INVALID_ARGUMENTS
839
807
if ( args . length === 2 ) return func ( await runOptimizedOrFallback ( args [ 0 ] , engine , context , above ) , await runOptimizedOrFallback ( args [ 1 ] , engine , context , above ) )
840
808
let prev = await runOptimizedOrFallback ( args [ 0 ] , engine , context , above )
841
809
for ( let i = 1 ; i < args . length ; i ++ ) {
@@ -873,7 +841,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
873
841
} ,
874
842
[ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
875
843
method : ( input , context , above , engine ) => {
876
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
844
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
877
845
let [ selector , mapper ] = input
878
846
879
847
selector = runOptimizedOrFallback ( selector , engine , context , above ) || [ ]
@@ -885,7 +853,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
885
853
} )
886
854
} ,
887
855
asyncMethod : async ( input , context , above , engine ) => {
888
- if ( ! Array . isArray ( input ) ) throw new InvalidControlInput ( input )
856
+ if ( ! Array . isArray ( input ) ) throw INVALID_ARGUMENTS
889
857
let [ selector , mapper ] = input
890
858
selector = ( await engine . run ( selector , context , { above } ) ) || [ ]
891
859
return asyncIterators [ name ] ( selector , async ( i , index ) => {
@@ -897,7 +865,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
897
865
} )
898
866
} ,
899
867
compile : ( data , buildState ) => {
900
- if ( ! Array . isArray ( data ) ) throw new InvalidControlInput ( data )
868
+ if ( ! Array . isArray ( data ) ) throw INVALID_ARGUMENTS
901
869
const { async } = buildState
902
870
const [ selector , mapper ] = data
903
871
0 commit comments