@luvio/graphql-parser 0.126.0 → 0.126.2

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.
Files changed (54) hide show
  1. package/dist/argument-node.d.ts +4 -0
  2. package/dist/ast.d.ts +95 -0
  3. package/dist/constants.d.ts +12 -0
  4. package/dist/directive-node.d.ts +5 -0
  5. package/dist/document.d.ts +3 -0
  6. package/dist/field-node.d.ts +4 -0
  7. package/dist/fragment-spread-node.d.ts +4 -0
  8. package/dist/fragment.d.ts +3 -0
  9. package/dist/gql.d.ts +51 -0
  10. package/dist/inline-fragment-node.d.ts +4 -0
  11. package/dist/luvioGraphqlParser.js +12945 -0
  12. package/dist/luvioGraphqlParser.mjs +12923 -0
  13. package/dist/main.d.ts +18 -0
  14. package/dist/metaschema.d.ts +10 -0
  15. package/dist/operation/index.d.ts +3 -0
  16. package/dist/operation/query/index.d.ts +6 -0
  17. package/dist/type-node.d.ts +3 -0
  18. package/dist/util/language.d.ts +9 -0
  19. package/dist/value-node.d.ts +4 -0
  20. package/dist/variable-definition.d.ts +4 -0
  21. package/dist/visitor.d.ts +4 -0
  22. package/package.json +4 -1
  23. package/babel.config.js +0 -1
  24. package/jest.config.js +0 -8
  25. package/project.json +0 -7
  26. package/rollup.config.js +0 -24
  27. package/scripts/cli.mjs +0 -18
  28. package/src/__tests__/ast.json +0 -403
  29. package/src/__tests__/ast.spec.ts +0 -109
  30. package/src/__tests__/astNoLoc.json +0 -147
  31. package/src/__tests__/gql.spec.ts +0 -665
  32. package/src/__tests__/main.spec.ts +0 -651
  33. package/src/__tests__/metaschema.spec.ts +0 -230
  34. package/src/__tests__/type-node.spec.ts +0 -82
  35. package/src/argument-node.ts +0 -18
  36. package/src/ast.ts +0 -200
  37. package/src/constants.ts +0 -14
  38. package/src/directive-node.ts +0 -36
  39. package/src/document.ts +0 -29
  40. package/src/field-node.ts +0 -72
  41. package/src/fragment-spread-node.ts +0 -28
  42. package/src/fragment.ts +0 -46
  43. package/src/gql.ts +0 -222
  44. package/src/inline-fragment-node.ts +0 -31
  45. package/src/main.ts +0 -134
  46. package/src/metaschema.ts +0 -162
  47. package/src/operation/index.ts +0 -12
  48. package/src/operation/query/index.ts +0 -78
  49. package/src/type-node.ts +0 -40
  50. package/src/util/language.ts +0 -10
  51. package/src/value-node.ts +0 -71
  52. package/src/variable-definition.ts +0 -37
  53. package/src/visitor.ts +0 -63
  54. package/tsconfig.json +0 -9
@@ -1,651 +0,0 @@
1
- import * as parser from '../main';
2
- import { astResolver, stripLocation } from '../gql';
3
-
4
- describe('LDS GraphQL Parser', () => {
5
- describe('parseAndVisit', () => {
6
- it('transforms GraphQL operation into a custom AST', () => {
7
- const source = /* GraphQL */ `
8
- query {
9
- uiapi {
10
- query {
11
- Account(where: { Name: { like: "Account1" } }) @connection {
12
- edges {
13
- node @resource(type: "Record") {
14
- Name {
15
- value
16
- displayValue
17
- }
18
- }
19
- }
20
- }
21
- }
22
- }
23
- }
24
- `;
25
-
26
- const expected = {
27
- kind: 'Document',
28
- definitions: [
29
- {
30
- kind: 'OperationDefinition',
31
- operation: 'query',
32
- luvioSelections: [
33
- {
34
- kind: 'ObjectFieldSelection',
35
- name: 'uiapi',
36
- luvioSelections: [
37
- {
38
- kind: 'ObjectFieldSelection',
39
- name: 'query',
40
- luvioSelections: [
41
- {
42
- kind: 'CustomFieldSelection',
43
- name: 'Account',
44
- type: 'Connection',
45
- luvioSelections: [
46
- {
47
- kind: 'ObjectFieldSelection',
48
- name: 'edges',
49
- luvioSelections: [
50
- {
51
- kind: 'CustomFieldSelection',
52
- name: 'node',
53
- type: 'Record',
54
- luvioSelections: [
55
- {
56
- kind: 'ObjectFieldSelection',
57
- name: 'Name',
58
- luvioSelections: [
59
- {
60
- kind: 'ScalarFieldSelection',
61
- name: 'value',
62
- },
63
- {
64
- kind: 'ScalarFieldSelection',
65
- name: 'displayValue',
66
- },
67
- ],
68
- },
69
- ],
70
- },
71
- ],
72
- },
73
- ],
74
- arguments: [
75
- {
76
- kind: 'Argument',
77
- name: 'where',
78
- value: {
79
- kind: 'ObjectValue',
80
- fields: {
81
- Name: {
82
- kind: 'ObjectValue',
83
- fields: {
84
- like: {
85
- kind: 'StringValue',
86
- value: 'Account1',
87
- },
88
- },
89
- },
90
- },
91
- },
92
- },
93
- ],
94
- },
95
- ],
96
- },
97
- ],
98
- },
99
- ],
100
- },
101
- ],
102
- };
103
-
104
- const target = parser.parseAndVisit(source);
105
-
106
- expect(target).toStrictEqual(expected);
107
- });
108
-
109
- it('transforms GraphQL connection directive on child property', () => {
110
- const source = /* GraphQL */ `
111
- query {
112
- uiapi {
113
- query {
114
- Account(where: { Name: { like: "Account1" } }) @connection {
115
- edges {
116
- node @resource(type: "Record") {
117
- Child @connection {
118
- edges {
119
- Id
120
- }
121
- }
122
- }
123
- }
124
- }
125
- }
126
- }
127
- }
128
- `;
129
-
130
- const expected = {
131
- kind: 'Document',
132
- definitions: [
133
- {
134
- kind: 'OperationDefinition',
135
- operation: 'query',
136
- luvioSelections: [
137
- {
138
- kind: 'ObjectFieldSelection',
139
- name: 'uiapi',
140
- luvioSelections: [
141
- {
142
- kind: 'ObjectFieldSelection',
143
- name: 'query',
144
- luvioSelections: [
145
- {
146
- kind: 'CustomFieldSelection',
147
- name: 'Account',
148
- type: 'Connection',
149
- luvioSelections: [
150
- {
151
- kind: 'ObjectFieldSelection',
152
- name: 'edges',
153
- luvioSelections: [
154
- {
155
- kind: 'CustomFieldSelection',
156
- name: 'node',
157
- type: 'Record',
158
- luvioSelections: [
159
- {
160
- kind: 'CustomFieldSelection',
161
- name: 'Child',
162
- type: 'Connection',
163
- luvioSelections: [
164
- {
165
- kind: 'ObjectFieldSelection',
166
- name: 'edges',
167
- luvioSelections: [
168
- {
169
- kind: 'ScalarFieldSelection',
170
- name: 'Id',
171
- },
172
- ],
173
- },
174
- ],
175
- },
176
- ],
177
- },
178
- ],
179
- },
180
- ],
181
- arguments: [
182
- {
183
- kind: 'Argument',
184
- name: 'where',
185
- value: {
186
- kind: 'ObjectValue',
187
- fields: {
188
- Name: {
189
- kind: 'ObjectValue',
190
- fields: {
191
- like: {
192
- kind: 'StringValue',
193
- value: 'Account1',
194
- },
195
- },
196
- },
197
- },
198
- },
199
- },
200
- ],
201
- },
202
- ],
203
- },
204
- ],
205
- },
206
- ],
207
- },
208
- ],
209
- };
210
-
211
- const target = parser.parseAndVisit(source);
212
-
213
- expect(target).toStrictEqual(expected);
214
- });
215
-
216
- it('transforms GraphQL fragment into a custom AST', () => {
217
- const source = /* GraphQL */ `
218
- fragment requiredFields on Record {
219
- id
220
- WeakEtag
221
- ApiName
222
- DisplayValue
223
- LastModifiedById {
224
- value
225
- }
226
- LastModifiedDate {
227
- value
228
- }
229
- SystemModstamp {
230
- value
231
- }
232
- RecordTypeId {
233
- value
234
- }
235
- }
236
- `;
237
-
238
- const expected = {
239
- kind: 'Document',
240
- definitions: [
241
- {
242
- kind: 'FragmentDefinition',
243
- name: 'requiredFields',
244
- typeCondition: { kind: 'NamedType', name: 'Record' },
245
- luvioSelections: [
246
- { kind: 'ScalarFieldSelection', name: 'id' },
247
- { kind: 'ScalarFieldSelection', name: 'WeakEtag' },
248
- { kind: 'ScalarFieldSelection', name: 'ApiName' },
249
- { kind: 'ScalarFieldSelection', name: 'DisplayValue' },
250
- {
251
- kind: 'ObjectFieldSelection',
252
- name: 'LastModifiedById',
253
- luvioSelections: [{ kind: 'ScalarFieldSelection', name: 'value' }],
254
- },
255
- {
256
- kind: 'ObjectFieldSelection',
257
- name: 'LastModifiedDate',
258
- luvioSelections: [{ kind: 'ScalarFieldSelection', name: 'value' }],
259
- },
260
- {
261
- kind: 'ObjectFieldSelection',
262
- name: 'SystemModstamp',
263
- luvioSelections: [{ kind: 'ScalarFieldSelection', name: 'value' }],
264
- },
265
- {
266
- kind: 'ObjectFieldSelection',
267
- name: 'RecordTypeId',
268
- luvioSelections: [{ kind: 'ScalarFieldSelection', name: 'value' }],
269
- },
270
- ],
271
- },
272
- ],
273
- };
274
-
275
- const target = parser.parseAndVisit(source);
276
- expect(target).toStrictEqual(expected);
277
- });
278
-
279
- it('throws an error for unsupported GraphQL definition', () => {
280
- const source = /* GraphQL */ `
281
- type Character {
282
- name: String!
283
- appearsIn: [Episode!]!
284
- }
285
- `;
286
-
287
- expect(() => parser.parseAndVisit(source)).toThrowError(
288
- 'Unsupported ObjectTypeDefinition definition. Only OperationDefinition and FragmentDefinition are supported in a GraphQL Document'
289
- );
290
- });
291
-
292
- it('throws an error for unsupported GraphQL operation definition', () => {
293
- const source = /* GraphQL */ `
294
- mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
295
- createReview(episode: $ep, review: $review) {
296
- stars
297
- commentary
298
- }
299
- }
300
- `;
301
-
302
- expect(() => parser.parseAndVisit(source)).toThrowError(
303
- 'Unsupported mutation operation. Only query operation is supported'
304
- );
305
- });
306
-
307
- it('transforms variable definitions', () => {
308
- const source = /* GraphQL */ `
309
- query HeroNameAndFriends($episode: Episode = JEDI) {
310
- hero(episode: $episode) {
311
- name
312
- friends {
313
- name
314
- }
315
- }
316
- }
317
- `;
318
-
319
- const expected = {
320
- kind: 'Document',
321
- definitions: [
322
- {
323
- kind: 'OperationDefinition',
324
- operation: 'query',
325
- name: 'HeroNameAndFriends',
326
- luvioSelections: [
327
- {
328
- kind: 'ObjectFieldSelection',
329
- name: 'hero',
330
- luvioSelections: [
331
- { kind: 'ScalarFieldSelection', name: 'name' },
332
- {
333
- kind: 'ObjectFieldSelection',
334
- name: 'friends',
335
- luvioSelections: [
336
- { kind: 'ScalarFieldSelection', name: 'name' },
337
- ],
338
- },
339
- ],
340
- arguments: [
341
- {
342
- kind: 'Argument',
343
- name: 'episode',
344
- value: { kind: 'Variable', name: 'episode' },
345
- },
346
- ],
347
- },
348
- ],
349
- variableDefinitions: [
350
- {
351
- kind: 'VariableDefinition',
352
- variable: { kind: 'Variable', name: 'episode' },
353
- type: { kind: 'NamedType', name: 'Episode' },
354
- defaultValue: { kind: 'EnumValue', value: 'JEDI' },
355
- },
356
- ],
357
- },
358
- ],
359
- };
360
-
361
- const target = parser.parseAndVisit(source);
362
-
363
- expect(target).toStrictEqual(expected);
364
- });
365
-
366
- it("throws an error when variable definition isn't used", () => {
367
- const source = /* GraphQL */ `
368
- query HeroNameAndFriends($episode: Episode = JEDI) {
369
- hero(episode: JEDI) {
370
- name
371
- friends {
372
- name
373
- }
374
- }
375
- }
376
- `;
377
-
378
- expect(() => parser.parseAndVisit(source)).toThrowError(
379
- 'Variable $episode was defined but never used.'
380
- );
381
- });
382
-
383
- it("throws an error when variable used isn't defined", () => {
384
- const source = /* GraphQL */ `
385
- query HeroNameAndFriends {
386
- hero(episode: $episode) {
387
- name
388
- friends {
389
- name
390
- }
391
- }
392
- }
393
- `;
394
-
395
- expect(() => parser.parseAndVisit(source)).toThrowError(
396
- 'Variable $episode was used but never defined.'
397
- );
398
- });
399
-
400
- it('transform directives', () => {
401
- const source = /* GraphQL */ `
402
- query Hero($episode: Episode) {
403
- hero(episode: $episode) {
404
- name
405
- friends @include(if: true) {
406
- name
407
- }
408
- }
409
- }
410
- `;
411
-
412
- const expected = {
413
- kind: 'Document',
414
- definitions: [
415
- {
416
- kind: 'OperationDefinition',
417
- operation: 'query',
418
- name: 'Hero',
419
- luvioSelections: [
420
- {
421
- kind: 'ObjectFieldSelection',
422
- name: 'hero',
423
- luvioSelections: [
424
- { kind: 'ScalarFieldSelection', name: 'name' },
425
- {
426
- kind: 'ObjectFieldSelection',
427
- name: 'friends',
428
- luvioSelections: [
429
- { kind: 'ScalarFieldSelection', name: 'name' },
430
- ],
431
- directives: [
432
- {
433
- kind: 'Directive',
434
- name: 'include',
435
- arguments: [
436
- {
437
- kind: 'Argument',
438
- name: 'if',
439
- value: {
440
- kind: 'BooleanValue',
441
- value: true,
442
- },
443
- },
444
- ],
445
- },
446
- ],
447
- },
448
- ],
449
- arguments: [
450
- {
451
- kind: 'Argument',
452
- name: 'episode',
453
- value: { kind: 'Variable', name: 'episode' },
454
- },
455
- ],
456
- },
457
- ],
458
- variableDefinitions: [
459
- {
460
- kind: 'VariableDefinition',
461
- variable: { kind: 'Variable', name: 'episode' },
462
- type: { kind: 'NamedType', name: 'Episode' },
463
- },
464
- ],
465
- },
466
- ],
467
- };
468
-
469
- const target = parser.parseAndVisit(source);
470
-
471
- expect(target).toStrictEqual(expected);
472
- });
473
-
474
- it('transform fragment spread', () => {
475
- const source = /* GraphQL */ `
476
- {
477
- aliasTest: hero(episode: EMPIRE) {
478
- ...nameField
479
- appearsIn
480
- }
481
- }
482
-
483
- fragment nameField on Character {
484
- name
485
- }
486
- `;
487
-
488
- const expected = {
489
- kind: 'Document',
490
- definitions: [
491
- {
492
- kind: 'OperationDefinition',
493
- operation: 'query',
494
- luvioSelections: [
495
- {
496
- kind: 'ObjectFieldSelection',
497
- name: 'hero',
498
- luvioSelections: [
499
- { kind: 'FragmentSpread', name: 'nameField' },
500
- { kind: 'ScalarFieldSelection', name: 'appearsIn' },
501
- ],
502
- arguments: [
503
- {
504
- kind: 'Argument',
505
- name: 'episode',
506
- value: { kind: 'EnumValue', value: 'EMPIRE' },
507
- },
508
- ],
509
- alias: 'aliasTest',
510
- },
511
- ],
512
- },
513
- {
514
- kind: 'FragmentDefinition',
515
- name: 'nameField',
516
- typeCondition: { kind: 'NamedType', name: 'Character' },
517
- luvioSelections: [{ kind: 'ScalarFieldSelection', name: 'name' }],
518
- },
519
- ],
520
- };
521
-
522
- const target = parser.parseAndVisit(source);
523
-
524
- expect(target).toStrictEqual(expected);
525
- });
526
-
527
- it('transform inline fragment', () => {
528
- const source = /* GraphQL */ `
529
- query HeroForEpisode($ep: Episode!) {
530
- hero(episode: $ep) {
531
- name
532
- ... on Droid {
533
- primaryFunction
534
- }
535
- ... on Human {
536
- height
537
- }
538
- }
539
- }
540
- `;
541
-
542
- const expected = {
543
- kind: 'Document',
544
- definitions: [
545
- {
546
- kind: 'OperationDefinition',
547
- operation: 'query',
548
- luvioSelections: [
549
- {
550
- kind: 'ObjectFieldSelection',
551
- name: 'hero',
552
- luvioSelections: [
553
- { kind: 'ScalarFieldSelection', name: 'name' },
554
- {
555
- kind: 'InlineFragment',
556
- luvioSelections: [
557
- {
558
- kind: 'ScalarFieldSelection',
559
- name: 'primaryFunction',
560
- },
561
- ],
562
- typeCondition: { kind: 'NamedType', name: 'Droid' },
563
- },
564
- {
565
- kind: 'InlineFragment',
566
- luvioSelections: [
567
- { kind: 'ScalarFieldSelection', name: 'height' },
568
- ],
569
- typeCondition: { kind: 'NamedType', name: 'Human' },
570
- },
571
- ],
572
- arguments: [
573
- {
574
- kind: 'Argument',
575
- name: 'episode',
576
- value: { kind: 'Variable', name: 'ep' },
577
- },
578
- ],
579
- },
580
- ],
581
- name: 'HeroForEpisode',
582
- variableDefinitions: [
583
- {
584
- kind: 'VariableDefinition',
585
- variable: { kind: 'Variable', name: 'ep' },
586
- type: {
587
- kind: 'NonNullType',
588
- type: { kind: 'NamedType', name: 'Episode' },
589
- },
590
- },
591
- ],
592
- },
593
- ],
594
- };
595
-
596
- const target = parser.parseAndVisit(source);
597
-
598
- expect(target).toStrictEqual(expected);
599
- });
600
- });
601
-
602
- describe('metaschema', () => {
603
- it('should be able to use luvio document node as key to get metaschema AST', () => {
604
- const source = /* GraphQL */ `
605
- query {
606
- uiapi {
607
- query {
608
- Account(where: { Name: { like: "Account1" } }) @connection {
609
- edges {
610
- node @resource(type: "Record") {
611
- Name {
612
- value
613
- displayValue
614
- }
615
- }
616
- }
617
- }
618
- }
619
- }
620
- }
621
- `;
622
-
623
- const metaschemaSource = /* GraphQL */ `
624
- query {
625
- uiapi {
626
- query {
627
- Account(where: { Name: { like: "Account1" } })
628
- @category(name: "recordQuery") {
629
- edges {
630
- node {
631
- Name {
632
- value
633
- displayValue
634
- }
635
- }
636
- }
637
- }
638
- }
639
- }
640
- }
641
- `;
642
-
643
- const target = parser.parseAndVisit(source);
644
- const metaschemaAST = astResolver(target);
645
-
646
- expect(stripLocation(metaschemaAST)).toStrictEqual(
647
- stripLocation(parser.parse(metaschemaSource))
648
- );
649
- });
650
- });
651
- });