@nymphjs/query-parser 1.0.0-alpha.34 → 1.0.0-alpha.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,856 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const queryParser_1 = __importDefault(require("./queryParser"));
7
+ const BlogPost = function () { };
8
+ const Category = function () { };
9
+ describe('queryParser', () => {
10
+ it('parses a basic query', () => {
11
+ const query = 'search';
12
+ const [options, ...selectors] = (0, queryParser_1.default)({
13
+ query,
14
+ entityClass: BlogPost,
15
+ defaultFields: ['text'],
16
+ });
17
+ expect(options).toEqual({
18
+ class: BlogPost,
19
+ });
20
+ expect(selectors).toEqual([
21
+ {
22
+ type: '|',
23
+ ilike: [['text', '%search%']],
24
+ },
25
+ ]);
26
+ });
27
+ it('allows bare queries to be customized', () => {
28
+ const query = 'search';
29
+ const [options, ...selectors] = (0, queryParser_1.default)({
30
+ query,
31
+ entityClass: BlogPost,
32
+ defaultFields: ['text'],
33
+ bareHandler: (input, entityClass, defaultFields) => {
34
+ expect(input).toEqual('search');
35
+ expect(entityClass).toBe(BlogPost);
36
+ expect(defaultFields).toEqual(['text']);
37
+ return {
38
+ equal: ['custom', input],
39
+ };
40
+ },
41
+ });
42
+ expect(options).toEqual({
43
+ class: BlogPost,
44
+ });
45
+ expect(selectors).toEqual([
46
+ {
47
+ type: '|',
48
+ equal: ['custom', 'search'],
49
+ },
50
+ ]);
51
+ });
52
+ it('gives the correct entity and default fields to bare queries', () => {
53
+ const query = 'category<{cat search}>';
54
+ const [options, ...selectors] = (0, queryParser_1.default)({
55
+ query,
56
+ entityClass: BlogPost,
57
+ defaultFields: ['text'],
58
+ qrefMap: {
59
+ cat: {
60
+ class: Category,
61
+ defaultFields: ['name'],
62
+ },
63
+ },
64
+ bareHandler: (input, entityClass, defaultFields) => {
65
+ expect(input).toEqual('search');
66
+ expect(entityClass).toBe(Category);
67
+ expect(defaultFields).toEqual(['name']);
68
+ return {
69
+ type: '!&',
70
+ equal: ['custom', input],
71
+ };
72
+ },
73
+ });
74
+ expect(options).toEqual({
75
+ class: BlogPost,
76
+ });
77
+ expect(selectors).toEqual([
78
+ {
79
+ type: '&',
80
+ qref: [
81
+ [
82
+ 'category',
83
+ [{ class: Category }, { type: '!&', equal: ['custom', 'search'] }],
84
+ ],
85
+ ],
86
+ },
87
+ ]);
88
+ });
89
+ it('parses the example query from the readme', () => {
90
+ const query = 'limit:4 foobar (| [archived] mdate<"2 weeks ago") category<{cat Tech}>';
91
+ const [options, ...selectors] = (0, queryParser_1.default)({
92
+ query,
93
+ entityClass: BlogPost,
94
+ defaultFields: ['title', 'body'],
95
+ qrefMap: {
96
+ cat: {
97
+ class: Category,
98
+ defaultFields: ['name'],
99
+ },
100
+ },
101
+ });
102
+ expect(options).toEqual({
103
+ class: BlogPost,
104
+ limit: 4,
105
+ });
106
+ expect(selectors).toEqual([
107
+ {
108
+ type: '&',
109
+ selector: [
110
+ {
111
+ type: '|',
112
+ truthy: ['archived'],
113
+ lt: [['mdate', null, '2 weeks ago']],
114
+ },
115
+ ],
116
+ qref: [
117
+ [
118
+ 'category',
119
+ [
120
+ {
121
+ class: Category,
122
+ },
123
+ {
124
+ type: '|',
125
+ ilike: [['name', '%Tech%']],
126
+ },
127
+ ],
128
+ ],
129
+ ],
130
+ },
131
+ {
132
+ type: '|',
133
+ ilike: [
134
+ ['title', '%foobar%'],
135
+ ['body', '%foobar%'],
136
+ ],
137
+ },
138
+ ]);
139
+ });
140
+ it('parses all options', () => {
141
+ const query = 'limit:10 offset:15 reverse:true search';
142
+ const [options, ...selectors] = (0, queryParser_1.default)({
143
+ query,
144
+ entityClass: BlogPost,
145
+ defaultFields: ['text'],
146
+ });
147
+ expect(options).toEqual({
148
+ class: BlogPost,
149
+ limit: 10,
150
+ offset: 15,
151
+ reverse: true,
152
+ });
153
+ expect(selectors).toEqual([
154
+ {
155
+ type: '|',
156
+ ilike: [['text', '%search%']],
157
+ },
158
+ ]);
159
+ });
160
+ it('parses simple equal clauses', () => {
161
+ const query = 'prop=string';
162
+ const [options, ...selectors] = (0, queryParser_1.default)({
163
+ query,
164
+ entityClass: BlogPost,
165
+ });
166
+ expect(options).toEqual({
167
+ class: BlogPost,
168
+ });
169
+ expect(selectors).toEqual([
170
+ {
171
+ type: '&',
172
+ equal: [['prop', 'string']],
173
+ },
174
+ ]);
175
+ });
176
+ it('parses simple not equal clauses', () => {
177
+ const query = 'prop!=string';
178
+ const [options, ...selectors] = (0, queryParser_1.default)({
179
+ query,
180
+ entityClass: BlogPost,
181
+ });
182
+ expect(options).toEqual({
183
+ class: BlogPost,
184
+ });
185
+ expect(selectors).toEqual([
186
+ {
187
+ type: '&',
188
+ '!equal': [['prop', 'string']],
189
+ },
190
+ ]);
191
+ });
192
+ it('parses quoted equal clauses', () => {
193
+ const query = 'prop="a string"';
194
+ const [options, ...selectors] = (0, queryParser_1.default)({
195
+ query,
196
+ entityClass: BlogPost,
197
+ });
198
+ expect(options).toEqual({
199
+ class: BlogPost,
200
+ });
201
+ expect(selectors).toEqual([
202
+ {
203
+ type: '&',
204
+ equal: [['prop', 'a string']],
205
+ },
206
+ ]);
207
+ });
208
+ it('parses quoted not equal clauses', () => {
209
+ const query = 'prop!="a string"';
210
+ const [options, ...selectors] = (0, queryParser_1.default)({
211
+ query,
212
+ entityClass: BlogPost,
213
+ });
214
+ expect(options).toEqual({
215
+ class: BlogPost,
216
+ });
217
+ expect(selectors).toEqual([
218
+ {
219
+ type: '&',
220
+ '!equal': [['prop', 'a string']],
221
+ },
222
+ ]);
223
+ });
224
+ it('parses json equal clauses', () => {
225
+ const query = 'prop=true';
226
+ const [options, ...selectors] = (0, queryParser_1.default)({
227
+ query,
228
+ entityClass: BlogPost,
229
+ });
230
+ expect(options).toEqual({
231
+ class: BlogPost,
232
+ });
233
+ expect(selectors).toEqual([
234
+ {
235
+ type: '&',
236
+ equal: [['prop', true]],
237
+ },
238
+ ]);
239
+ });
240
+ it('parses json not equal clauses', () => {
241
+ const query = 'prop!=true';
242
+ const [options, ...selectors] = (0, queryParser_1.default)({
243
+ query,
244
+ entityClass: BlogPost,
245
+ });
246
+ expect(options).toEqual({
247
+ class: BlogPost,
248
+ });
249
+ expect(selectors).toEqual([
250
+ {
251
+ type: '&',
252
+ '!equal': [['prop', true]],
253
+ },
254
+ ]);
255
+ });
256
+ it('parses guid clauses', () => {
257
+ const query = '{111111111111111111111111}';
258
+ const [options, ...selectors] = (0, queryParser_1.default)({
259
+ query,
260
+ entityClass: BlogPost,
261
+ });
262
+ expect(options).toEqual({
263
+ class: BlogPost,
264
+ });
265
+ expect(selectors).toEqual([
266
+ {
267
+ type: '&',
268
+ guid: ['111111111111111111111111'],
269
+ },
270
+ ]);
271
+ });
272
+ it('parses not guid clauses', () => {
273
+ const query = '{!111111111111111111111111}';
274
+ const [options, ...selectors] = (0, queryParser_1.default)({
275
+ query,
276
+ entityClass: BlogPost,
277
+ });
278
+ expect(options).toEqual({
279
+ class: BlogPost,
280
+ });
281
+ expect(selectors).toEqual([
282
+ {
283
+ type: '&',
284
+ '!guid': ['111111111111111111111111'],
285
+ },
286
+ ]);
287
+ });
288
+ it('parses tag clauses', () => {
289
+ const query = '<tagname>';
290
+ const [options, ...selectors] = (0, queryParser_1.default)({
291
+ query,
292
+ entityClass: BlogPost,
293
+ });
294
+ expect(options).toEqual({
295
+ class: BlogPost,
296
+ });
297
+ expect(selectors).toEqual([
298
+ {
299
+ type: '&',
300
+ tag: ['tagname'],
301
+ },
302
+ ]);
303
+ });
304
+ it('parses not tag clauses', () => {
305
+ const query = '<!tagname>';
306
+ const [options, ...selectors] = (0, queryParser_1.default)({
307
+ query,
308
+ entityClass: BlogPost,
309
+ });
310
+ expect(options).toEqual({
311
+ class: BlogPost,
312
+ });
313
+ expect(selectors).toEqual([
314
+ {
315
+ type: '&',
316
+ '!tag': ['tagname'],
317
+ },
318
+ ]);
319
+ });
320
+ it('parses truthy clauses', () => {
321
+ const query = '[truthyname]';
322
+ const [options, ...selectors] = (0, queryParser_1.default)({
323
+ query,
324
+ entityClass: BlogPost,
325
+ });
326
+ expect(options).toEqual({
327
+ class: BlogPost,
328
+ });
329
+ expect(selectors).toEqual([
330
+ {
331
+ type: '&',
332
+ truthy: ['truthyname'],
333
+ },
334
+ ]);
335
+ });
336
+ it('parses not truthy clauses', () => {
337
+ const query = '[!truthyname]';
338
+ const [options, ...selectors] = (0, queryParser_1.default)({
339
+ query,
340
+ entityClass: BlogPost,
341
+ });
342
+ expect(options).toEqual({
343
+ class: BlogPost,
344
+ });
345
+ expect(selectors).toEqual([
346
+ {
347
+ type: '&',
348
+ '!truthy': ['truthyname'],
349
+ },
350
+ ]);
351
+ });
352
+ it('parses ref clauses', () => {
353
+ const query = 'prop<{111111111111111111111111}>';
354
+ const [options, ...selectors] = (0, queryParser_1.default)({
355
+ query,
356
+ entityClass: BlogPost,
357
+ });
358
+ expect(options).toEqual({
359
+ class: BlogPost,
360
+ });
361
+ expect(selectors).toEqual([
362
+ {
363
+ type: '&',
364
+ ref: [['prop', '111111111111111111111111']],
365
+ },
366
+ ]);
367
+ });
368
+ it('parses not ref clauses', () => {
369
+ const query = 'prop!<{111111111111111111111111}>';
370
+ const [options, ...selectors] = (0, queryParser_1.default)({
371
+ query,
372
+ entityClass: BlogPost,
373
+ });
374
+ expect(options).toEqual({
375
+ class: BlogPost,
376
+ });
377
+ expect(selectors).toEqual([
378
+ {
379
+ type: '&',
380
+ '!ref': [['prop', '111111111111111111111111']],
381
+ },
382
+ ]);
383
+ });
384
+ it('parses simple contain clauses', () => {
385
+ const query = 'prop<string>';
386
+ const [options, ...selectors] = (0, queryParser_1.default)({
387
+ query,
388
+ entityClass: BlogPost,
389
+ });
390
+ expect(options).toEqual({
391
+ class: BlogPost,
392
+ });
393
+ expect(selectors).toEqual([
394
+ {
395
+ type: '&',
396
+ contain: [['prop', 'string']],
397
+ },
398
+ ]);
399
+ });
400
+ it('parses simple not contain clauses', () => {
401
+ const query = 'prop!<string>';
402
+ const [options, ...selectors] = (0, queryParser_1.default)({
403
+ query,
404
+ entityClass: BlogPost,
405
+ });
406
+ expect(options).toEqual({
407
+ class: BlogPost,
408
+ });
409
+ expect(selectors).toEqual([
410
+ {
411
+ type: '&',
412
+ '!contain': [['prop', 'string']],
413
+ },
414
+ ]);
415
+ });
416
+ it('parses json contain clauses', () => {
417
+ const query = 'prop<true>';
418
+ const [options, ...selectors] = (0, queryParser_1.default)({
419
+ query,
420
+ entityClass: BlogPost,
421
+ });
422
+ expect(options).toEqual({
423
+ class: BlogPost,
424
+ });
425
+ expect(selectors).toEqual([
426
+ {
427
+ type: '&',
428
+ contain: [['prop', true]],
429
+ },
430
+ ]);
431
+ });
432
+ it('parses json not contain clauses', () => {
433
+ const query = 'prop!<true>';
434
+ const [options, ...selectors] = (0, queryParser_1.default)({
435
+ query,
436
+ entityClass: BlogPost,
437
+ });
438
+ expect(options).toEqual({
439
+ class: BlogPost,
440
+ });
441
+ expect(selectors).toEqual([
442
+ {
443
+ type: '&',
444
+ '!contain': [['prop', true]],
445
+ },
446
+ ]);
447
+ });
448
+ it('parses match clauses', () => {
449
+ const query = 'prop~/regex/';
450
+ const [options, ...selectors] = (0, queryParser_1.default)({
451
+ query,
452
+ entityClass: BlogPost,
453
+ });
454
+ expect(options).toEqual({
455
+ class: BlogPost,
456
+ });
457
+ expect(selectors).toEqual([
458
+ {
459
+ type: '&',
460
+ match: [['prop', 'regex']],
461
+ },
462
+ ]);
463
+ });
464
+ it('parses not match clauses', () => {
465
+ const query = 'prop!~/regex/';
466
+ const [options, ...selectors] = (0, queryParser_1.default)({
467
+ query,
468
+ entityClass: BlogPost,
469
+ });
470
+ expect(options).toEqual({
471
+ class: BlogPost,
472
+ });
473
+ expect(selectors).toEqual([
474
+ {
475
+ type: '&',
476
+ '!match': [['prop', 'regex']],
477
+ },
478
+ ]);
479
+ });
480
+ it('parses imatch clauses', () => {
481
+ const query = 'prop~/regex/i';
482
+ const [options, ...selectors] = (0, queryParser_1.default)({
483
+ query,
484
+ entityClass: BlogPost,
485
+ });
486
+ expect(options).toEqual({
487
+ class: BlogPost,
488
+ });
489
+ expect(selectors).toEqual([
490
+ {
491
+ type: '&',
492
+ imatch: [['prop', 'regex']],
493
+ },
494
+ ]);
495
+ });
496
+ it('parses not imatch clauses', () => {
497
+ const query = 'prop!~/regex/i';
498
+ const [options, ...selectors] = (0, queryParser_1.default)({
499
+ query,
500
+ entityClass: BlogPost,
501
+ });
502
+ expect(options).toEqual({
503
+ class: BlogPost,
504
+ });
505
+ expect(selectors).toEqual([
506
+ {
507
+ type: '&',
508
+ '!imatch': [['prop', 'regex']],
509
+ },
510
+ ]);
511
+ });
512
+ it('parses simple like clauses', () => {
513
+ const query = 'prop~pattern';
514
+ const [options, ...selectors] = (0, queryParser_1.default)({
515
+ query,
516
+ entityClass: BlogPost,
517
+ });
518
+ expect(options).toEqual({
519
+ class: BlogPost,
520
+ });
521
+ expect(selectors).toEqual([
522
+ {
523
+ type: '&',
524
+ like: [['prop', 'pattern']],
525
+ },
526
+ ]);
527
+ });
528
+ it('parses simple not like clauses', () => {
529
+ const query = 'prop!~pattern';
530
+ const [options, ...selectors] = (0, queryParser_1.default)({
531
+ query,
532
+ entityClass: BlogPost,
533
+ });
534
+ expect(options).toEqual({
535
+ class: BlogPost,
536
+ });
537
+ expect(selectors).toEqual([
538
+ {
539
+ type: '&',
540
+ '!like': [['prop', 'pattern']],
541
+ },
542
+ ]);
543
+ });
544
+ it('parses quoted like clauses', () => {
545
+ const query = 'prop~"a pattern"';
546
+ const [options, ...selectors] = (0, queryParser_1.default)({
547
+ query,
548
+ entityClass: BlogPost,
549
+ });
550
+ expect(options).toEqual({
551
+ class: BlogPost,
552
+ });
553
+ expect(selectors).toEqual([
554
+ {
555
+ type: '&',
556
+ like: [['prop', 'a pattern']],
557
+ },
558
+ ]);
559
+ });
560
+ it('parses quoted not like clauses', () => {
561
+ const query = 'prop!~"a pattern"';
562
+ const [options, ...selectors] = (0, queryParser_1.default)({
563
+ query,
564
+ entityClass: BlogPost,
565
+ });
566
+ expect(options).toEqual({
567
+ class: BlogPost,
568
+ });
569
+ expect(selectors).toEqual([
570
+ {
571
+ type: '&',
572
+ '!like': [['prop', 'a pattern']],
573
+ },
574
+ ]);
575
+ });
576
+ it('parses ilike clauses', () => {
577
+ const query = 'prop~"a pattern"i';
578
+ const [options, ...selectors] = (0, queryParser_1.default)({
579
+ query,
580
+ entityClass: BlogPost,
581
+ });
582
+ expect(options).toEqual({
583
+ class: BlogPost,
584
+ });
585
+ expect(selectors).toEqual([
586
+ {
587
+ type: '&',
588
+ ilike: [['prop', 'a pattern']],
589
+ },
590
+ ]);
591
+ });
592
+ it('parses not ilike clauses', () => {
593
+ const query = 'prop!~"a pattern"i';
594
+ const [options, ...selectors] = (0, queryParser_1.default)({
595
+ query,
596
+ entityClass: BlogPost,
597
+ });
598
+ expect(options).toEqual({
599
+ class: BlogPost,
600
+ });
601
+ expect(selectors).toEqual([
602
+ {
603
+ type: '&',
604
+ '!ilike': [['prop', 'a pattern']],
605
+ },
606
+ ]);
607
+ });
608
+ it('parses simple gt clauses', () => {
609
+ const query = 'prop>30.5';
610
+ const [options, ...selectors] = (0, queryParser_1.default)({
611
+ query,
612
+ entityClass: BlogPost,
613
+ });
614
+ expect(options).toEqual({
615
+ class: BlogPost,
616
+ });
617
+ expect(selectors).toEqual([
618
+ {
619
+ type: '&',
620
+ gt: [['prop', 30.5]],
621
+ },
622
+ ]);
623
+ });
624
+ it('parses simple relative gt clauses', () => {
625
+ const query = 'prop>yesterday';
626
+ const [options, ...selectors] = (0, queryParser_1.default)({
627
+ query,
628
+ entityClass: BlogPost,
629
+ });
630
+ expect(options).toEqual({
631
+ class: BlogPost,
632
+ });
633
+ expect(selectors).toEqual([
634
+ {
635
+ type: '&',
636
+ gt: [['prop', null, 'yesterday']],
637
+ },
638
+ ]);
639
+ });
640
+ it('parses quote relative gt clauses', () => {
641
+ const query = 'prop>"3 weeks ago"';
642
+ const [options, ...selectors] = (0, queryParser_1.default)({
643
+ query,
644
+ entityClass: BlogPost,
645
+ });
646
+ expect(options).toEqual({
647
+ class: BlogPost,
648
+ });
649
+ expect(selectors).toEqual([
650
+ {
651
+ type: '&',
652
+ gt: [['prop', null, '3 weeks ago']],
653
+ },
654
+ ]);
655
+ });
656
+ it('parses simple gte clauses', () => {
657
+ const query = 'prop>=30.5';
658
+ const [options, ...selectors] = (0, queryParser_1.default)({
659
+ query,
660
+ entityClass: BlogPost,
661
+ });
662
+ expect(options).toEqual({
663
+ class: BlogPost,
664
+ });
665
+ expect(selectors).toEqual([
666
+ {
667
+ type: '&',
668
+ gte: [['prop', 30.5]],
669
+ },
670
+ ]);
671
+ });
672
+ it('parses simple relative gte clauses', () => {
673
+ const query = 'prop>=yesterday';
674
+ const [options, ...selectors] = (0, queryParser_1.default)({
675
+ query,
676
+ entityClass: BlogPost,
677
+ });
678
+ expect(options).toEqual({
679
+ class: BlogPost,
680
+ });
681
+ expect(selectors).toEqual([
682
+ {
683
+ type: '&',
684
+ gte: [['prop', null, 'yesterday']],
685
+ },
686
+ ]);
687
+ });
688
+ it('parses quote relative gte clauses', () => {
689
+ const query = 'prop>="3 weeks ago"';
690
+ const [options, ...selectors] = (0, queryParser_1.default)({
691
+ query,
692
+ entityClass: BlogPost,
693
+ });
694
+ expect(options).toEqual({
695
+ class: BlogPost,
696
+ });
697
+ expect(selectors).toEqual([
698
+ {
699
+ type: '&',
700
+ gte: [['prop', null, '3 weeks ago']],
701
+ },
702
+ ]);
703
+ });
704
+ it('parses simple lt clauses', () => {
705
+ const query = 'prop<30.5';
706
+ const [options, ...selectors] = (0, queryParser_1.default)({
707
+ query,
708
+ entityClass: BlogPost,
709
+ });
710
+ expect(options).toEqual({
711
+ class: BlogPost,
712
+ });
713
+ expect(selectors).toEqual([
714
+ {
715
+ type: '&',
716
+ lt: [['prop', 30.5]],
717
+ },
718
+ ]);
719
+ });
720
+ it('parses simple relative lt clauses', () => {
721
+ const query = 'prop<yesterday';
722
+ const [options, ...selectors] = (0, queryParser_1.default)({
723
+ query,
724
+ entityClass: BlogPost,
725
+ });
726
+ expect(options).toEqual({
727
+ class: BlogPost,
728
+ });
729
+ expect(selectors).toEqual([
730
+ {
731
+ type: '&',
732
+ lt: [['prop', null, 'yesterday']],
733
+ },
734
+ ]);
735
+ });
736
+ it('parses quote relative lt clauses', () => {
737
+ const query = 'prop<"3 weeks ago"';
738
+ const [options, ...selectors] = (0, queryParser_1.default)({
739
+ query,
740
+ entityClass: BlogPost,
741
+ });
742
+ expect(options).toEqual({
743
+ class: BlogPost,
744
+ });
745
+ expect(selectors).toEqual([
746
+ {
747
+ type: '&',
748
+ lt: [['prop', null, '3 weeks ago']],
749
+ },
750
+ ]);
751
+ });
752
+ it('parses simple lte clauses', () => {
753
+ const query = 'prop<=30.5';
754
+ const [options, ...selectors] = (0, queryParser_1.default)({
755
+ query,
756
+ entityClass: BlogPost,
757
+ });
758
+ expect(options).toEqual({
759
+ class: BlogPost,
760
+ });
761
+ expect(selectors).toEqual([
762
+ {
763
+ type: '&',
764
+ lte: [['prop', 30.5]],
765
+ },
766
+ ]);
767
+ });
768
+ it('parses simple relative lte clauses', () => {
769
+ const query = 'prop<=yesterday';
770
+ const [options, ...selectors] = (0, queryParser_1.default)({
771
+ query,
772
+ entityClass: BlogPost,
773
+ });
774
+ expect(options).toEqual({
775
+ class: BlogPost,
776
+ });
777
+ expect(selectors).toEqual([
778
+ {
779
+ type: '&',
780
+ lte: [['prop', null, 'yesterday']],
781
+ },
782
+ ]);
783
+ });
784
+ it('parses quote relative lte clauses', () => {
785
+ const query = 'prop<="3 weeks ago"';
786
+ const [options, ...selectors] = (0, queryParser_1.default)({
787
+ query,
788
+ entityClass: BlogPost,
789
+ });
790
+ expect(options).toEqual({
791
+ class: BlogPost,
792
+ });
793
+ expect(selectors).toEqual([
794
+ {
795
+ type: '&',
796
+ lte: [['prop', null, '3 weeks ago']],
797
+ },
798
+ ]);
799
+ });
800
+ it('parses complex selectors', () => {
801
+ const query = '(! [published] <draft>) (| cdate>"6 months ago" mdate>"1 month ago")';
802
+ const [options, ...selectors] = (0, queryParser_1.default)({
803
+ query,
804
+ entityClass: BlogPost,
805
+ });
806
+ expect(options).toEqual({
807
+ class: BlogPost,
808
+ });
809
+ expect(selectors).toEqual([
810
+ {
811
+ type: '&',
812
+ selector: [
813
+ {
814
+ type: '|',
815
+ gt: [
816
+ ['cdate', null, '6 months ago'],
817
+ ['mdate', null, '1 month ago'],
818
+ ],
819
+ },
820
+ {
821
+ type: '!&',
822
+ truthy: ['published'],
823
+ tag: ['draft'],
824
+ },
825
+ ],
826
+ },
827
+ ]);
828
+ });
829
+ it('parses nested selectors', () => {
830
+ const query = '(! [published] <draft> (| cdate>"6 months ago" mdate>"1 month ago"))';
831
+ const [options, ...selectors] = (0, queryParser_1.default)({
832
+ query,
833
+ entityClass: BlogPost,
834
+ });
835
+ expect(options).toEqual({
836
+ class: BlogPost,
837
+ });
838
+ expect(selectors).toEqual([
839
+ {
840
+ type: '!&',
841
+ truthy: ['published'],
842
+ tag: ['draft'],
843
+ selector: [
844
+ {
845
+ type: '|',
846
+ gt: [
847
+ ['cdate', null, '6 months ago'],
848
+ ['mdate', null, '1 month ago'],
849
+ ],
850
+ },
851
+ ],
852
+ },
853
+ ]);
854
+ });
855
+ });
856
+ //# sourceMappingURL=queryParser.test.js.map