@nymphjs/query-parser 1.0.0-beta.11 → 1.0.0-beta.111
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.
- package/CHANGELOG.md +419 -0
- package/README.md +16 -6
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/{lib → dist}/queryParser.js +166 -50
- package/dist/queryParser.js.map +1 -0
- package/{lib → dist}/queryParser.test.js +402 -54
- package/dist/queryParser.test.js.map +1 -0
- package/jest.config.js +11 -2
- package/package.json +22 -29
- package/src/index.ts +2 -2
- package/src/queryParser.test.ts +395 -2
- package/src/queryParser.ts +153 -48
- package/tsconfig.json +6 -4
- package/typedoc.json +4 -0
- package/lib/index.d.ts +0 -4
- package/lib/index.js +0 -25
- package/lib/index.js.map +0 -1
- package/lib/queryParser.js.map +0 -1
- package/lib/queryParser.test.js.map +0 -1
- package/webpack.config.js +0 -28
- /package/{lib → dist}/queryParser.d.ts +0 -0
- /package/{lib → dist}/queryParser.test.d.ts +0 -0
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
|
|
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"));
|
|
1
|
+
import queryParser from './queryParser.js';
|
|
7
2
|
const BlogPost = function () { };
|
|
8
3
|
const Category = function () { };
|
|
9
4
|
describe('queryParser', () => {
|
|
10
5
|
it('parses a basic query', () => {
|
|
11
6
|
const query = 'search';
|
|
12
|
-
const [options, ...selectors] = (
|
|
7
|
+
const [options, ...selectors] = queryParser({
|
|
13
8
|
query,
|
|
14
9
|
entityClass: BlogPost,
|
|
15
10
|
defaultFields: ['text'],
|
|
@@ -26,7 +21,7 @@ describe('queryParser', () => {
|
|
|
26
21
|
});
|
|
27
22
|
it('allows bare queries to be customized', () => {
|
|
28
23
|
const query = 'search';
|
|
29
|
-
const [options, ...selectors] = (
|
|
24
|
+
const [options, ...selectors] = queryParser({
|
|
30
25
|
query,
|
|
31
26
|
entityClass: BlogPost,
|
|
32
27
|
defaultFields: ['text'],
|
|
@@ -51,7 +46,7 @@ describe('queryParser', () => {
|
|
|
51
46
|
});
|
|
52
47
|
it('gives the correct entity and default fields to bare queries', () => {
|
|
53
48
|
const query = 'category<{cat search}>';
|
|
54
|
-
const [options, ...selectors] = (
|
|
49
|
+
const [options, ...selectors] = queryParser({
|
|
55
50
|
query,
|
|
56
51
|
entityClass: BlogPost,
|
|
57
52
|
defaultFields: ['text'],
|
|
@@ -88,7 +83,7 @@ describe('queryParser', () => {
|
|
|
88
83
|
});
|
|
89
84
|
it('parses the example query from the readme', () => {
|
|
90
85
|
const query = 'limit:4 foobar (| [archived] mdate<"2 weeks ago") category<{cat Tech}>';
|
|
91
|
-
const [options, ...selectors] = (
|
|
86
|
+
const [options, ...selectors] = queryParser({
|
|
92
87
|
query,
|
|
93
88
|
entityClass: BlogPost,
|
|
94
89
|
defaultFields: ['title', 'body'],
|
|
@@ -137,9 +132,316 @@ describe('queryParser', () => {
|
|
|
137
132
|
},
|
|
138
133
|
]);
|
|
139
134
|
});
|
|
135
|
+
it('parses a query with json value with spaces', () => {
|
|
136
|
+
const query = 'obj={"prop": "my value"} foobar arr=["a value", "another value"]';
|
|
137
|
+
const [options, ...selectors] = queryParser({
|
|
138
|
+
query,
|
|
139
|
+
entityClass: BlogPost,
|
|
140
|
+
defaultFields: ['title', 'body'],
|
|
141
|
+
});
|
|
142
|
+
expect(options).toEqual({
|
|
143
|
+
class: BlogPost,
|
|
144
|
+
});
|
|
145
|
+
expect(selectors).toEqual([
|
|
146
|
+
{
|
|
147
|
+
type: '&',
|
|
148
|
+
equal: [
|
|
149
|
+
['obj', { prop: 'my value' }],
|
|
150
|
+
['arr', ['a value', 'another value']],
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: '|',
|
|
155
|
+
ilike: [
|
|
156
|
+
['title', '%foobar%'],
|
|
157
|
+
['body', '%foobar%'],
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
]);
|
|
161
|
+
});
|
|
162
|
+
it('parses a query with nested json value with spaces', () => {
|
|
163
|
+
const query = 'obj={"obj": {"sub": "my value"}, "prop": "my value"} foobar arr=["a value", "another value", {"prop": [1, 2, 3]}]';
|
|
164
|
+
const [options, ...selectors] = queryParser({
|
|
165
|
+
query,
|
|
166
|
+
entityClass: BlogPost,
|
|
167
|
+
defaultFields: ['title', 'body'],
|
|
168
|
+
});
|
|
169
|
+
expect(options).toEqual({
|
|
170
|
+
class: BlogPost,
|
|
171
|
+
});
|
|
172
|
+
expect(selectors).toEqual([
|
|
173
|
+
{
|
|
174
|
+
type: '&',
|
|
175
|
+
equal: [
|
|
176
|
+
['obj', { obj: { sub: 'my value' }, prop: 'my value' }],
|
|
177
|
+
['arr', ['a value', 'another value', { prop: [1, 2, 3] }]],
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: '|',
|
|
182
|
+
ilike: [
|
|
183
|
+
['title', '%foobar%'],
|
|
184
|
+
['body', '%foobar%'],
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
]);
|
|
188
|
+
});
|
|
189
|
+
it('parses a query with broken json', () => {
|
|
190
|
+
const query = 'obj={"obj":"val"';
|
|
191
|
+
const [options, ...selectors] = queryParser({
|
|
192
|
+
query,
|
|
193
|
+
entityClass: BlogPost,
|
|
194
|
+
defaultFields: ['title', 'body'],
|
|
195
|
+
});
|
|
196
|
+
expect(options).toEqual({
|
|
197
|
+
class: BlogPost,
|
|
198
|
+
});
|
|
199
|
+
expect(selectors).toEqual([
|
|
200
|
+
{
|
|
201
|
+
type: '&',
|
|
202
|
+
equal: [['obj', '{"obj":"val"']],
|
|
203
|
+
},
|
|
204
|
+
]);
|
|
205
|
+
});
|
|
206
|
+
it('parses a query with broken json and correct json', () => {
|
|
207
|
+
const query = 'obj={"obj":"val" another={"prop":"value"}';
|
|
208
|
+
const [options, ...selectors] = queryParser({
|
|
209
|
+
query,
|
|
210
|
+
entityClass: BlogPost,
|
|
211
|
+
defaultFields: ['title', 'body'],
|
|
212
|
+
});
|
|
213
|
+
expect(options).toEqual({
|
|
214
|
+
class: BlogPost,
|
|
215
|
+
});
|
|
216
|
+
expect(selectors).toEqual([
|
|
217
|
+
{
|
|
218
|
+
type: '&',
|
|
219
|
+
equal: [
|
|
220
|
+
['another', { prop: 'value' }],
|
|
221
|
+
['obj', '{"obj":"val"'],
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
]);
|
|
225
|
+
});
|
|
226
|
+
it('parses a query with search', () => {
|
|
227
|
+
const query = 'limit:4 foobar prop(a search string)';
|
|
228
|
+
const [options, ...selectors] = queryParser({
|
|
229
|
+
query,
|
|
230
|
+
entityClass: BlogPost,
|
|
231
|
+
defaultFields: ['title', 'body'],
|
|
232
|
+
qrefMap: {
|
|
233
|
+
cat: {
|
|
234
|
+
class: Category,
|
|
235
|
+
defaultFields: ['name'],
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
expect(options).toEqual({
|
|
240
|
+
class: BlogPost,
|
|
241
|
+
limit: 4,
|
|
242
|
+
});
|
|
243
|
+
expect(selectors).toEqual([
|
|
244
|
+
{
|
|
245
|
+
type: '&',
|
|
246
|
+
search: [['prop', 'a search string']],
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
type: '|',
|
|
250
|
+
ilike: [
|
|
251
|
+
['title', '%foobar%'],
|
|
252
|
+
['body', '%foobar%'],
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
]);
|
|
256
|
+
});
|
|
257
|
+
it('parses a query with search in a selector', () => {
|
|
258
|
+
const query = 'limit:4 foobar (| prop(a search string) prop2("another search string"))';
|
|
259
|
+
const [options, ...selectors] = queryParser({
|
|
260
|
+
query,
|
|
261
|
+
entityClass: BlogPost,
|
|
262
|
+
defaultFields: ['title', 'body'],
|
|
263
|
+
qrefMap: {
|
|
264
|
+
cat: {
|
|
265
|
+
class: Category,
|
|
266
|
+
defaultFields: ['name'],
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
expect(options).toEqual({
|
|
271
|
+
class: BlogPost,
|
|
272
|
+
limit: 4,
|
|
273
|
+
});
|
|
274
|
+
expect(selectors).toEqual([
|
|
275
|
+
{
|
|
276
|
+
type: '&',
|
|
277
|
+
selector: [
|
|
278
|
+
{
|
|
279
|
+
type: '|',
|
|
280
|
+
search: [
|
|
281
|
+
['prop', 'a search string'],
|
|
282
|
+
['prop2', '"another search string"'],
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
type: '|',
|
|
289
|
+
ilike: [
|
|
290
|
+
['title', '%foobar%'],
|
|
291
|
+
['body', '%foobar%'],
|
|
292
|
+
],
|
|
293
|
+
},
|
|
294
|
+
]);
|
|
295
|
+
});
|
|
296
|
+
it('parses a query with lt and tag', () => {
|
|
297
|
+
const query = 'limit:4 foobar mdate<"2 weeks ago" <tag>';
|
|
298
|
+
const [options, ...selectors] = queryParser({
|
|
299
|
+
query,
|
|
300
|
+
entityClass: BlogPost,
|
|
301
|
+
defaultFields: ['title', 'body'],
|
|
302
|
+
qrefMap: {
|
|
303
|
+
cat: {
|
|
304
|
+
class: Category,
|
|
305
|
+
defaultFields: ['name'],
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
expect(options).toEqual({
|
|
310
|
+
class: BlogPost,
|
|
311
|
+
limit: 4,
|
|
312
|
+
});
|
|
313
|
+
expect(selectors).toEqual([
|
|
314
|
+
{
|
|
315
|
+
type: '&',
|
|
316
|
+
lt: [['mdate', null, '2 weeks ago']],
|
|
317
|
+
tag: ['tag'],
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
type: '|',
|
|
321
|
+
ilike: [
|
|
322
|
+
['title', '%foobar%'],
|
|
323
|
+
['body', '%foobar%'],
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
]);
|
|
327
|
+
});
|
|
328
|
+
it('parses a query with contain that has brackets', () => {
|
|
329
|
+
const query = 'limit:4 foobar string<"a string with < and > characters">';
|
|
330
|
+
const [options, ...selectors] = queryParser({
|
|
331
|
+
query,
|
|
332
|
+
entityClass: BlogPost,
|
|
333
|
+
defaultFields: ['title', 'body'],
|
|
334
|
+
qrefMap: {
|
|
335
|
+
cat: {
|
|
336
|
+
class: Category,
|
|
337
|
+
defaultFields: ['name'],
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
expect(options).toEqual({
|
|
342
|
+
class: BlogPost,
|
|
343
|
+
limit: 4,
|
|
344
|
+
});
|
|
345
|
+
expect(selectors).toEqual([
|
|
346
|
+
{
|
|
347
|
+
type: '&',
|
|
348
|
+
contain: [['string', 'a string with < and > characters']],
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
type: '|',
|
|
352
|
+
ilike: [
|
|
353
|
+
['title', '%foobar%'],
|
|
354
|
+
['body', '%foobar%'],
|
|
355
|
+
],
|
|
356
|
+
},
|
|
357
|
+
]);
|
|
358
|
+
});
|
|
359
|
+
it('parses a query with contain that has quotes', () => {
|
|
360
|
+
const query = 'limit:4 foobar string<"a string with a \\" characters">';
|
|
361
|
+
const [options, ...selectors] = queryParser({
|
|
362
|
+
query,
|
|
363
|
+
entityClass: BlogPost,
|
|
364
|
+
defaultFields: ['title', 'body'],
|
|
365
|
+
qrefMap: {
|
|
366
|
+
cat: {
|
|
367
|
+
class: Category,
|
|
368
|
+
defaultFields: ['name'],
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
expect(options).toEqual({
|
|
373
|
+
class: BlogPost,
|
|
374
|
+
limit: 4,
|
|
375
|
+
});
|
|
376
|
+
expect(selectors).toEqual([
|
|
377
|
+
{
|
|
378
|
+
type: '&',
|
|
379
|
+
contain: [['string', 'a string with a " characters']],
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
type: '|',
|
|
383
|
+
ilike: [
|
|
384
|
+
['title', '%foobar%'],
|
|
385
|
+
['body', '%foobar%'],
|
|
386
|
+
],
|
|
387
|
+
},
|
|
388
|
+
]);
|
|
389
|
+
});
|
|
390
|
+
it('parses a query with a dash in the property name', () => {
|
|
391
|
+
const query = 'limit:4 foobar Test-Prop<"a string">';
|
|
392
|
+
const [options, ...selectors] = queryParser({
|
|
393
|
+
query,
|
|
394
|
+
entityClass: BlogPost,
|
|
395
|
+
defaultFields: ['title', 'body'],
|
|
396
|
+
qrefMap: {
|
|
397
|
+
cat: {
|
|
398
|
+
class: Category,
|
|
399
|
+
defaultFields: ['name'],
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
expect(options).toEqual({
|
|
404
|
+
class: BlogPost,
|
|
405
|
+
limit: 4,
|
|
406
|
+
});
|
|
407
|
+
expect(selectors).toEqual([
|
|
408
|
+
{
|
|
409
|
+
type: '&',
|
|
410
|
+
contain: [['Test-Prop', 'a string']],
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
type: '|',
|
|
414
|
+
ilike: [
|
|
415
|
+
['title', '%foobar%'],
|
|
416
|
+
['body', '%foobar%'],
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
]);
|
|
420
|
+
});
|
|
140
421
|
it('parses all options', () => {
|
|
141
|
-
const query = 'limit:10 offset:15 reverse:true search';
|
|
142
|
-
const [options, ...selectors] = (
|
|
422
|
+
const query = 'limit:10 offset:15 sort:someProp reverse:true search';
|
|
423
|
+
const [options, ...selectors] = queryParser({
|
|
424
|
+
query,
|
|
425
|
+
entityClass: BlogPost,
|
|
426
|
+
defaultFields: ['text'],
|
|
427
|
+
});
|
|
428
|
+
expect(options).toEqual({
|
|
429
|
+
class: BlogPost,
|
|
430
|
+
limit: 10,
|
|
431
|
+
offset: 15,
|
|
432
|
+
sort: 'someProp',
|
|
433
|
+
reverse: true,
|
|
434
|
+
});
|
|
435
|
+
expect(selectors).toEqual([
|
|
436
|
+
{
|
|
437
|
+
type: '|',
|
|
438
|
+
ilike: [['text', '%search%']],
|
|
439
|
+
},
|
|
440
|
+
]);
|
|
441
|
+
});
|
|
442
|
+
it('parses null sort option', () => {
|
|
443
|
+
const query = 'limit:10 offset:15 sort:- reverse:true search';
|
|
444
|
+
const [options, ...selectors] = queryParser({
|
|
143
445
|
query,
|
|
144
446
|
entityClass: BlogPost,
|
|
145
447
|
defaultFields: ['text'],
|
|
@@ -148,6 +450,7 @@ describe('queryParser', () => {
|
|
|
148
450
|
class: BlogPost,
|
|
149
451
|
limit: 10,
|
|
150
452
|
offset: 15,
|
|
453
|
+
sort: null,
|
|
151
454
|
reverse: true,
|
|
152
455
|
});
|
|
153
456
|
expect(selectors).toEqual([
|
|
@@ -159,7 +462,7 @@ describe('queryParser', () => {
|
|
|
159
462
|
});
|
|
160
463
|
it('parses simple equal clauses', () => {
|
|
161
464
|
const query = 'prop=string';
|
|
162
|
-
const [options, ...selectors] = (
|
|
465
|
+
const [options, ...selectors] = queryParser({
|
|
163
466
|
query,
|
|
164
467
|
entityClass: BlogPost,
|
|
165
468
|
});
|
|
@@ -175,7 +478,7 @@ describe('queryParser', () => {
|
|
|
175
478
|
});
|
|
176
479
|
it('parses simple not equal clauses', () => {
|
|
177
480
|
const query = 'prop!=string';
|
|
178
|
-
const [options, ...selectors] = (
|
|
481
|
+
const [options, ...selectors] = queryParser({
|
|
179
482
|
query,
|
|
180
483
|
entityClass: BlogPost,
|
|
181
484
|
});
|
|
@@ -191,7 +494,7 @@ describe('queryParser', () => {
|
|
|
191
494
|
});
|
|
192
495
|
it('parses quoted equal clauses', () => {
|
|
193
496
|
const query = 'prop="a string"';
|
|
194
|
-
const [options, ...selectors] = (
|
|
497
|
+
const [options, ...selectors] = queryParser({
|
|
195
498
|
query,
|
|
196
499
|
entityClass: BlogPost,
|
|
197
500
|
});
|
|
@@ -207,7 +510,7 @@ describe('queryParser', () => {
|
|
|
207
510
|
});
|
|
208
511
|
it('parses quoted not equal clauses', () => {
|
|
209
512
|
const query = 'prop!="a string"';
|
|
210
|
-
const [options, ...selectors] = (
|
|
513
|
+
const [options, ...selectors] = queryParser({
|
|
211
514
|
query,
|
|
212
515
|
entityClass: BlogPost,
|
|
213
516
|
});
|
|
@@ -223,7 +526,7 @@ describe('queryParser', () => {
|
|
|
223
526
|
});
|
|
224
527
|
it('parses json equal clauses', () => {
|
|
225
528
|
const query = 'prop=true';
|
|
226
|
-
const [options, ...selectors] = (
|
|
529
|
+
const [options, ...selectors] = queryParser({
|
|
227
530
|
query,
|
|
228
531
|
entityClass: BlogPost,
|
|
229
532
|
});
|
|
@@ -239,7 +542,7 @@ describe('queryParser', () => {
|
|
|
239
542
|
});
|
|
240
543
|
it('parses json not equal clauses', () => {
|
|
241
544
|
const query = 'prop!=true';
|
|
242
|
-
const [options, ...selectors] = (
|
|
545
|
+
const [options, ...selectors] = queryParser({
|
|
243
546
|
query,
|
|
244
547
|
entityClass: BlogPost,
|
|
245
548
|
});
|
|
@@ -255,7 +558,7 @@ describe('queryParser', () => {
|
|
|
255
558
|
});
|
|
256
559
|
it('parses guid clauses', () => {
|
|
257
560
|
const query = '{111111111111111111111111}';
|
|
258
|
-
const [options, ...selectors] = (
|
|
561
|
+
const [options, ...selectors] = queryParser({
|
|
259
562
|
query,
|
|
260
563
|
entityClass: BlogPost,
|
|
261
564
|
});
|
|
@@ -271,7 +574,7 @@ describe('queryParser', () => {
|
|
|
271
574
|
});
|
|
272
575
|
it('parses not guid clauses', () => {
|
|
273
576
|
const query = '{!111111111111111111111111}';
|
|
274
|
-
const [options, ...selectors] = (
|
|
577
|
+
const [options, ...selectors] = queryParser({
|
|
275
578
|
query,
|
|
276
579
|
entityClass: BlogPost,
|
|
277
580
|
});
|
|
@@ -287,7 +590,7 @@ describe('queryParser', () => {
|
|
|
287
590
|
});
|
|
288
591
|
it('parses tag clauses', () => {
|
|
289
592
|
const query = '<tagname>';
|
|
290
|
-
const [options, ...selectors] = (
|
|
593
|
+
const [options, ...selectors] = queryParser({
|
|
291
594
|
query,
|
|
292
595
|
entityClass: BlogPost,
|
|
293
596
|
});
|
|
@@ -303,7 +606,7 @@ describe('queryParser', () => {
|
|
|
303
606
|
});
|
|
304
607
|
it('parses not tag clauses', () => {
|
|
305
608
|
const query = '<!tagname>';
|
|
306
|
-
const [options, ...selectors] = (
|
|
609
|
+
const [options, ...selectors] = queryParser({
|
|
307
610
|
query,
|
|
308
611
|
entityClass: BlogPost,
|
|
309
612
|
});
|
|
@@ -319,7 +622,7 @@ describe('queryParser', () => {
|
|
|
319
622
|
});
|
|
320
623
|
it('parses truthy clauses', () => {
|
|
321
624
|
const query = '[truthyname]';
|
|
322
|
-
const [options, ...selectors] = (
|
|
625
|
+
const [options, ...selectors] = queryParser({
|
|
323
626
|
query,
|
|
324
627
|
entityClass: BlogPost,
|
|
325
628
|
});
|
|
@@ -335,7 +638,7 @@ describe('queryParser', () => {
|
|
|
335
638
|
});
|
|
336
639
|
it('parses not truthy clauses', () => {
|
|
337
640
|
const query = '[!truthyname]';
|
|
338
|
-
const [options, ...selectors] = (
|
|
641
|
+
const [options, ...selectors] = queryParser({
|
|
339
642
|
query,
|
|
340
643
|
entityClass: BlogPost,
|
|
341
644
|
});
|
|
@@ -351,7 +654,7 @@ describe('queryParser', () => {
|
|
|
351
654
|
});
|
|
352
655
|
it('parses ref clauses', () => {
|
|
353
656
|
const query = 'prop<{111111111111111111111111}>';
|
|
354
|
-
const [options, ...selectors] = (
|
|
657
|
+
const [options, ...selectors] = queryParser({
|
|
355
658
|
query,
|
|
356
659
|
entityClass: BlogPost,
|
|
357
660
|
});
|
|
@@ -367,7 +670,7 @@ describe('queryParser', () => {
|
|
|
367
670
|
});
|
|
368
671
|
it('parses not ref clauses', () => {
|
|
369
672
|
const query = 'prop!<{111111111111111111111111}>';
|
|
370
|
-
const [options, ...selectors] = (
|
|
673
|
+
const [options, ...selectors] = queryParser({
|
|
371
674
|
query,
|
|
372
675
|
entityClass: BlogPost,
|
|
373
676
|
});
|
|
@@ -383,7 +686,7 @@ describe('queryParser', () => {
|
|
|
383
686
|
});
|
|
384
687
|
it('parses simple contain clauses', () => {
|
|
385
688
|
const query = 'prop<string>';
|
|
386
|
-
const [options, ...selectors] = (
|
|
689
|
+
const [options, ...selectors] = queryParser({
|
|
387
690
|
query,
|
|
388
691
|
entityClass: BlogPost,
|
|
389
692
|
});
|
|
@@ -399,7 +702,7 @@ describe('queryParser', () => {
|
|
|
399
702
|
});
|
|
400
703
|
it('parses simple not contain clauses', () => {
|
|
401
704
|
const query = 'prop!<string>';
|
|
402
|
-
const [options, ...selectors] = (
|
|
705
|
+
const [options, ...selectors] = queryParser({
|
|
403
706
|
query,
|
|
404
707
|
entityClass: BlogPost,
|
|
405
708
|
});
|
|
@@ -415,7 +718,7 @@ describe('queryParser', () => {
|
|
|
415
718
|
});
|
|
416
719
|
it('parses json contain clauses', () => {
|
|
417
720
|
const query = 'prop<true>';
|
|
418
|
-
const [options, ...selectors] = (
|
|
721
|
+
const [options, ...selectors] = queryParser({
|
|
419
722
|
query,
|
|
420
723
|
entityClass: BlogPost,
|
|
421
724
|
});
|
|
@@ -431,7 +734,7 @@ describe('queryParser', () => {
|
|
|
431
734
|
});
|
|
432
735
|
it('parses json not contain clauses', () => {
|
|
433
736
|
const query = 'prop!<true>';
|
|
434
|
-
const [options, ...selectors] = (
|
|
737
|
+
const [options, ...selectors] = queryParser({
|
|
435
738
|
query,
|
|
436
739
|
entityClass: BlogPost,
|
|
437
740
|
});
|
|
@@ -447,7 +750,7 @@ describe('queryParser', () => {
|
|
|
447
750
|
});
|
|
448
751
|
it('parses match clauses', () => {
|
|
449
752
|
const query = 'prop~/regex/';
|
|
450
|
-
const [options, ...selectors] = (
|
|
753
|
+
const [options, ...selectors] = queryParser({
|
|
451
754
|
query,
|
|
452
755
|
entityClass: BlogPost,
|
|
453
756
|
});
|
|
@@ -463,7 +766,7 @@ describe('queryParser', () => {
|
|
|
463
766
|
});
|
|
464
767
|
it('parses not match clauses', () => {
|
|
465
768
|
const query = 'prop!~/regex/';
|
|
466
|
-
const [options, ...selectors] = (
|
|
769
|
+
const [options, ...selectors] = queryParser({
|
|
467
770
|
query,
|
|
468
771
|
entityClass: BlogPost,
|
|
469
772
|
});
|
|
@@ -479,7 +782,7 @@ describe('queryParser', () => {
|
|
|
479
782
|
});
|
|
480
783
|
it('parses imatch clauses', () => {
|
|
481
784
|
const query = 'prop~/regex/i';
|
|
482
|
-
const [options, ...selectors] = (
|
|
785
|
+
const [options, ...selectors] = queryParser({
|
|
483
786
|
query,
|
|
484
787
|
entityClass: BlogPost,
|
|
485
788
|
});
|
|
@@ -495,7 +798,7 @@ describe('queryParser', () => {
|
|
|
495
798
|
});
|
|
496
799
|
it('parses not imatch clauses', () => {
|
|
497
800
|
const query = 'prop!~/regex/i';
|
|
498
|
-
const [options, ...selectors] = (
|
|
801
|
+
const [options, ...selectors] = queryParser({
|
|
499
802
|
query,
|
|
500
803
|
entityClass: BlogPost,
|
|
501
804
|
});
|
|
@@ -511,7 +814,7 @@ describe('queryParser', () => {
|
|
|
511
814
|
});
|
|
512
815
|
it('parses simple like clauses', () => {
|
|
513
816
|
const query = 'prop~pattern';
|
|
514
|
-
const [options, ...selectors] = (
|
|
817
|
+
const [options, ...selectors] = queryParser({
|
|
515
818
|
query,
|
|
516
819
|
entityClass: BlogPost,
|
|
517
820
|
});
|
|
@@ -527,7 +830,7 @@ describe('queryParser', () => {
|
|
|
527
830
|
});
|
|
528
831
|
it('parses simple not like clauses', () => {
|
|
529
832
|
const query = 'prop!~pattern';
|
|
530
|
-
const [options, ...selectors] = (
|
|
833
|
+
const [options, ...selectors] = queryParser({
|
|
531
834
|
query,
|
|
532
835
|
entityClass: BlogPost,
|
|
533
836
|
});
|
|
@@ -543,7 +846,7 @@ describe('queryParser', () => {
|
|
|
543
846
|
});
|
|
544
847
|
it('parses quoted like clauses', () => {
|
|
545
848
|
const query = 'prop~"a pattern"';
|
|
546
|
-
const [options, ...selectors] = (
|
|
849
|
+
const [options, ...selectors] = queryParser({
|
|
547
850
|
query,
|
|
548
851
|
entityClass: BlogPost,
|
|
549
852
|
});
|
|
@@ -559,7 +862,7 @@ describe('queryParser', () => {
|
|
|
559
862
|
});
|
|
560
863
|
it('parses quoted not like clauses', () => {
|
|
561
864
|
const query = 'prop!~"a pattern"';
|
|
562
|
-
const [options, ...selectors] = (
|
|
865
|
+
const [options, ...selectors] = queryParser({
|
|
563
866
|
query,
|
|
564
867
|
entityClass: BlogPost,
|
|
565
868
|
});
|
|
@@ -575,7 +878,7 @@ describe('queryParser', () => {
|
|
|
575
878
|
});
|
|
576
879
|
it('parses ilike clauses', () => {
|
|
577
880
|
const query = 'prop~"a pattern"i';
|
|
578
|
-
const [options, ...selectors] = (
|
|
881
|
+
const [options, ...selectors] = queryParser({
|
|
579
882
|
query,
|
|
580
883
|
entityClass: BlogPost,
|
|
581
884
|
});
|
|
@@ -591,7 +894,7 @@ describe('queryParser', () => {
|
|
|
591
894
|
});
|
|
592
895
|
it('parses not ilike clauses', () => {
|
|
593
896
|
const query = 'prop!~"a pattern"i';
|
|
594
|
-
const [options, ...selectors] = (
|
|
897
|
+
const [options, ...selectors] = queryParser({
|
|
595
898
|
query,
|
|
596
899
|
entityClass: BlogPost,
|
|
597
900
|
});
|
|
@@ -607,7 +910,7 @@ describe('queryParser', () => {
|
|
|
607
910
|
});
|
|
608
911
|
it('parses simple gt clauses', () => {
|
|
609
912
|
const query = 'prop>30.5';
|
|
610
|
-
const [options, ...selectors] = (
|
|
913
|
+
const [options, ...selectors] = queryParser({
|
|
611
914
|
query,
|
|
612
915
|
entityClass: BlogPost,
|
|
613
916
|
});
|
|
@@ -623,7 +926,7 @@ describe('queryParser', () => {
|
|
|
623
926
|
});
|
|
624
927
|
it('parses simple relative gt clauses', () => {
|
|
625
928
|
const query = 'prop>yesterday';
|
|
626
|
-
const [options, ...selectors] = (
|
|
929
|
+
const [options, ...selectors] = queryParser({
|
|
627
930
|
query,
|
|
628
931
|
entityClass: BlogPost,
|
|
629
932
|
});
|
|
@@ -639,7 +942,7 @@ describe('queryParser', () => {
|
|
|
639
942
|
});
|
|
640
943
|
it('parses quote relative gt clauses', () => {
|
|
641
944
|
const query = 'prop>"3 weeks ago"';
|
|
642
|
-
const [options, ...selectors] = (
|
|
945
|
+
const [options, ...selectors] = queryParser({
|
|
643
946
|
query,
|
|
644
947
|
entityClass: BlogPost,
|
|
645
948
|
});
|
|
@@ -655,7 +958,7 @@ describe('queryParser', () => {
|
|
|
655
958
|
});
|
|
656
959
|
it('parses simple gte clauses', () => {
|
|
657
960
|
const query = 'prop>=30.5';
|
|
658
|
-
const [options, ...selectors] = (
|
|
961
|
+
const [options, ...selectors] = queryParser({
|
|
659
962
|
query,
|
|
660
963
|
entityClass: BlogPost,
|
|
661
964
|
});
|
|
@@ -671,7 +974,7 @@ describe('queryParser', () => {
|
|
|
671
974
|
});
|
|
672
975
|
it('parses simple relative gte clauses', () => {
|
|
673
976
|
const query = 'prop>=yesterday';
|
|
674
|
-
const [options, ...selectors] = (
|
|
977
|
+
const [options, ...selectors] = queryParser({
|
|
675
978
|
query,
|
|
676
979
|
entityClass: BlogPost,
|
|
677
980
|
});
|
|
@@ -687,7 +990,7 @@ describe('queryParser', () => {
|
|
|
687
990
|
});
|
|
688
991
|
it('parses quote relative gte clauses', () => {
|
|
689
992
|
const query = 'prop>="3 weeks ago"';
|
|
690
|
-
const [options, ...selectors] = (
|
|
993
|
+
const [options, ...selectors] = queryParser({
|
|
691
994
|
query,
|
|
692
995
|
entityClass: BlogPost,
|
|
693
996
|
});
|
|
@@ -703,7 +1006,7 @@ describe('queryParser', () => {
|
|
|
703
1006
|
});
|
|
704
1007
|
it('parses simple lt clauses', () => {
|
|
705
1008
|
const query = 'prop<30.5';
|
|
706
|
-
const [options, ...selectors] = (
|
|
1009
|
+
const [options, ...selectors] = queryParser({
|
|
707
1010
|
query,
|
|
708
1011
|
entityClass: BlogPost,
|
|
709
1012
|
});
|
|
@@ -719,7 +1022,7 @@ describe('queryParser', () => {
|
|
|
719
1022
|
});
|
|
720
1023
|
it('parses simple relative lt clauses', () => {
|
|
721
1024
|
const query = 'prop<yesterday';
|
|
722
|
-
const [options, ...selectors] = (
|
|
1025
|
+
const [options, ...selectors] = queryParser({
|
|
723
1026
|
query,
|
|
724
1027
|
entityClass: BlogPost,
|
|
725
1028
|
});
|
|
@@ -735,7 +1038,7 @@ describe('queryParser', () => {
|
|
|
735
1038
|
});
|
|
736
1039
|
it('parses quote relative lt clauses', () => {
|
|
737
1040
|
const query = 'prop<"3 weeks ago"';
|
|
738
|
-
const [options, ...selectors] = (
|
|
1041
|
+
const [options, ...selectors] = queryParser({
|
|
739
1042
|
query,
|
|
740
1043
|
entityClass: BlogPost,
|
|
741
1044
|
});
|
|
@@ -751,7 +1054,7 @@ describe('queryParser', () => {
|
|
|
751
1054
|
});
|
|
752
1055
|
it('parses simple lte clauses', () => {
|
|
753
1056
|
const query = 'prop<=30.5';
|
|
754
|
-
const [options, ...selectors] = (
|
|
1057
|
+
const [options, ...selectors] = queryParser({
|
|
755
1058
|
query,
|
|
756
1059
|
entityClass: BlogPost,
|
|
757
1060
|
});
|
|
@@ -767,7 +1070,7 @@ describe('queryParser', () => {
|
|
|
767
1070
|
});
|
|
768
1071
|
it('parses simple relative lte clauses', () => {
|
|
769
1072
|
const query = 'prop<=yesterday';
|
|
770
|
-
const [options, ...selectors] = (
|
|
1073
|
+
const [options, ...selectors] = queryParser({
|
|
771
1074
|
query,
|
|
772
1075
|
entityClass: BlogPost,
|
|
773
1076
|
});
|
|
@@ -783,7 +1086,7 @@ describe('queryParser', () => {
|
|
|
783
1086
|
});
|
|
784
1087
|
it('parses quote relative lte clauses', () => {
|
|
785
1088
|
const query = 'prop<="3 weeks ago"';
|
|
786
|
-
const [options, ...selectors] = (
|
|
1089
|
+
const [options, ...selectors] = queryParser({
|
|
787
1090
|
query,
|
|
788
1091
|
entityClass: BlogPost,
|
|
789
1092
|
});
|
|
@@ -799,7 +1102,7 @@ describe('queryParser', () => {
|
|
|
799
1102
|
});
|
|
800
1103
|
it('parses complex selectors', () => {
|
|
801
1104
|
const query = '(! [published] <draft>) (| cdate>"6 months ago" mdate>"1 month ago")';
|
|
802
|
-
const [options, ...selectors] = (
|
|
1105
|
+
const [options, ...selectors] = queryParser({
|
|
803
1106
|
query,
|
|
804
1107
|
entityClass: BlogPost,
|
|
805
1108
|
});
|
|
@@ -828,7 +1131,7 @@ describe('queryParser', () => {
|
|
|
828
1131
|
});
|
|
829
1132
|
it('parses nested selectors', () => {
|
|
830
1133
|
const query = '(! [published] <draft> (| cdate>"6 months ago" mdate>"1 month ago"))';
|
|
831
|
-
const [options, ...selectors] = (
|
|
1134
|
+
const [options, ...selectors] = queryParser({
|
|
832
1135
|
query,
|
|
833
1136
|
entityClass: BlogPost,
|
|
834
1137
|
});
|
|
@@ -852,5 +1155,50 @@ describe('queryParser', () => {
|
|
|
852
1155
|
},
|
|
853
1156
|
]);
|
|
854
1157
|
});
|
|
1158
|
+
it('parses nested qref clauses', () => {
|
|
1159
|
+
const query = 'categories<{Category parent<{Category id="sort+newsletters"}>}> ';
|
|
1160
|
+
const [options, ...selectors] = queryParser({
|
|
1161
|
+
query,
|
|
1162
|
+
entityClass: BlogPost,
|
|
1163
|
+
defaultFields: ['title', 'body'],
|
|
1164
|
+
qrefMap: {
|
|
1165
|
+
Category: {
|
|
1166
|
+
class: Category,
|
|
1167
|
+
defaultFields: ['name'],
|
|
1168
|
+
},
|
|
1169
|
+
},
|
|
1170
|
+
});
|
|
1171
|
+
expect(options).toEqual({
|
|
1172
|
+
class: BlogPost,
|
|
1173
|
+
});
|
|
1174
|
+
expect(selectors).toEqual([
|
|
1175
|
+
{
|
|
1176
|
+
type: '&',
|
|
1177
|
+
qref: [
|
|
1178
|
+
[
|
|
1179
|
+
'categories',
|
|
1180
|
+
[
|
|
1181
|
+
{ class: Category },
|
|
1182
|
+
{
|
|
1183
|
+
type: '&',
|
|
1184
|
+
qref: [
|
|
1185
|
+
[
|
|
1186
|
+
'parent',
|
|
1187
|
+
[
|
|
1188
|
+
{ class: Category },
|
|
1189
|
+
{
|
|
1190
|
+
type: '&',
|
|
1191
|
+
equal: [['id', 'sort+newsletters']],
|
|
1192
|
+
},
|
|
1193
|
+
],
|
|
1194
|
+
],
|
|
1195
|
+
],
|
|
1196
|
+
},
|
|
1197
|
+
],
|
|
1198
|
+
],
|
|
1199
|
+
],
|
|
1200
|
+
},
|
|
1201
|
+
]);
|
|
1202
|
+
});
|
|
855
1203
|
});
|
|
856
1204
|
//# sourceMappingURL=queryParser.test.js.map
|