Skip to content

Commit 6e4df56

Browse files
authored
refactor: Improve parse performance (#25)
* Combine value matchers into single regex match * Refactor object/list parser into leading loop * Turn arguments parsing into leading loop * Tweak type parsing implementation * Reformat variableDefinitions parsing * Refactor selectionSet parsing to merge branches * Pull out start of selections in parsing branches * Remove redundant length checks * Merge variable name into value parser * Merge float part into main regex * Absorb object/list parsing into value parser * Merge field parsing into selectionSet parser * Squash away typeCondition parser * Merge fragmentSpread into selectionSet parser * Remove redundant arrays in operation definitions * Extract OperationType matching to document parser * Avoid allocating variableDefinitions array as possible * Avoid allocating directives if possible * Avoid allocating arguments array if possible * Remove name() helper * Remove redundant ignore() calls * Add changeset * Remove redundant import * Add mising tests and remove redundant branches * Update comments * Add additional tests * Remove recursion from type() parser
1 parent 3f3b440 commit 6e4df56

File tree

5 files changed

+507
-350
lines changed

5 files changed

+507
-350
lines changed

.changeset/green-tables-exist.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@0no-co/graphql.web': patch
3+
---
4+
5+
Improve parser performance.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ dist/
88
coverage/
99
package-lock.json
1010
.DS_Store
11+
tsconfig.vitest-temp.json

src/__tests__/__snapshots__/parser.test.ts.snap

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
66
{
77
"directives": [
88
{
9-
"arguments": [],
9+
"arguments": undefined,
1010
"kind": "Directive",
1111
"name": {
1212
"kind": "Name",
@@ -50,7 +50,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
5050
},
5151
},
5252
],
53-
"directives": [],
53+
"directives": undefined,
5454
"kind": "Field",
5555
"name": {
5656
"kind": "Name",
@@ -61,8 +61,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
6161
"selections": [
6262
{
6363
"alias": undefined,
64-
"arguments": [],
65-
"directives": [],
64+
"arguments": undefined,
65+
"directives": undefined,
6666
"kind": "Field",
6767
"name": {
6868
"kind": "Name",
@@ -73,7 +73,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
7373
{
7474
"directives": [
7575
{
76-
"arguments": [],
76+
"arguments": undefined,
7777
"kind": "Directive",
7878
"name": {
7979
"kind": "Name",
@@ -87,8 +87,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
8787
"selections": [
8888
{
8989
"alias": undefined,
90-
"arguments": [],
91-
"directives": [],
90+
"arguments": undefined,
91+
"directives": undefined,
9292
"kind": "Field",
9393
"name": {
9494
"kind": "Name",
@@ -99,8 +99,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
9999
"selections": [
100100
{
101101
"alias": undefined,
102-
"arguments": [],
103-
"directives": [],
102+
"arguments": undefined,
103+
"directives": undefined,
104104
"kind": "Field",
105105
"name": {
106106
"kind": "Name",
@@ -175,8 +175,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
175175
"selections": [
176176
{
177177
"alias": undefined,
178-
"arguments": [],
179-
"directives": [],
178+
"arguments": undefined,
179+
"directives": undefined,
180180
"kind": "Field",
181181
"name": {
182182
"kind": "Name",
@@ -187,7 +187,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
187187
{
188188
"directives": [
189189
{
190-
"arguments": [],
190+
"arguments": undefined,
191191
"kind": "Directive",
192192
"name": {
193193
"kind": "Name",
@@ -249,8 +249,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
249249
"selections": [
250250
{
251251
"alias": undefined,
252-
"arguments": [],
253-
"directives": [],
252+
"arguments": undefined,
253+
"directives": undefined,
254254
"kind": "Field",
255255
"name": {
256256
"kind": "Name",
@@ -263,15 +263,15 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
263263
"typeCondition": undefined,
264264
},
265265
{
266-
"directives": [],
266+
"directives": undefined,
267267
"kind": "InlineFragment",
268268
"selectionSet": {
269269
"kind": "SelectionSet",
270270
"selections": [
271271
{
272272
"alias": undefined,
273-
"arguments": [],
274-
"directives": [],
273+
"arguments": undefined,
274+
"directives": undefined,
275275
"kind": "Field",
276276
"name": {
277277
"kind": "Name",
@@ -291,7 +291,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
291291
"variableDefinitions": [
292292
{
293293
"defaultValue": undefined,
294-
"directives": [],
294+
"directives": undefined,
295295
"kind": "VariableDefinition",
296296
"type": {
297297
"kind": "NamedType",
@@ -313,7 +313,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
313313
"kind": "EnumValue",
314314
"value": "MOBILE",
315315
},
316-
"directives": [],
316+
"directives": undefined,
317317
"kind": "VariableDefinition",
318318
"type": {
319319
"kind": "NamedType",
@@ -335,7 +335,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
335335
{
336336
"directives": [
337337
{
338-
"arguments": [],
338+
"arguments": undefined,
339339
"kind": "Directive",
340340
"name": {
341341
"kind": "Name",
@@ -369,7 +369,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
369369
],
370370
"directives": [
371371
{
372-
"arguments": [],
372+
"arguments": undefined,
373373
"kind": "Directive",
374374
"name": {
375375
"kind": "Name",
@@ -387,8 +387,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
387387
"selections": [
388388
{
389389
"alias": undefined,
390-
"arguments": [],
391-
"directives": [],
390+
"arguments": undefined,
391+
"directives": undefined,
392392
"kind": "Field",
393393
"name": {
394394
"kind": "Name",
@@ -399,10 +399,10 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
399399
"selections": [
400400
{
401401
"alias": undefined,
402-
"arguments": [],
402+
"arguments": undefined,
403403
"directives": [
404404
{
405-
"arguments": [],
405+
"arguments": undefined,
406406
"kind": "Directive",
407407
"name": {
408408
"kind": "Name",
@@ -425,12 +425,12 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
425425
},
426426
],
427427
},
428-
"variableDefinitions": [],
428+
"variableDefinitions": undefined,
429429
},
430430
{
431431
"directives": [
432432
{
433-
"arguments": [],
433+
"arguments": undefined,
434434
"kind": "Directive",
435435
"name": {
436436
"kind": "Name",
@@ -465,7 +465,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
465465
},
466466
},
467467
],
468-
"directives": [],
468+
"directives": undefined,
469469
"kind": "Field",
470470
"name": {
471471
"kind": "Name",
@@ -476,8 +476,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
476476
"selections": [
477477
{
478478
"alias": undefined,
479-
"arguments": [],
480-
"directives": [],
479+
"arguments": undefined,
480+
"directives": undefined,
481481
"kind": "Field",
482482
"name": {
483483
"kind": "Name",
@@ -488,8 +488,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
488488
"selections": [
489489
{
490490
"alias": undefined,
491-
"arguments": [],
492-
"directives": [],
491+
"arguments": undefined,
492+
"directives": undefined,
493493
"kind": "Field",
494494
"name": {
495495
"kind": "Name",
@@ -500,8 +500,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
500500
"selections": [
501501
{
502502
"alias": undefined,
503-
"arguments": [],
504-
"directives": [],
503+
"arguments": undefined,
504+
"directives": undefined,
505505
"kind": "Field",
506506
"name": {
507507
"kind": "Name",
@@ -514,8 +514,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
514514
},
515515
{
516516
"alias": undefined,
517-
"arguments": [],
518-
"directives": [],
517+
"arguments": undefined,
518+
"directives": undefined,
519519
"kind": "Field",
520520
"name": {
521521
"kind": "Name",
@@ -526,8 +526,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
526526
"selections": [
527527
{
528528
"alias": undefined,
529-
"arguments": [],
530-
"directives": [],
529+
"arguments": undefined,
530+
"directives": undefined,
531531
"kind": "Field",
532532
"name": {
533533
"kind": "Name",
@@ -549,7 +549,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
549549
"variableDefinitions": [
550550
{
551551
"defaultValue": undefined,
552-
"directives": [],
552+
"directives": undefined,
553553
"kind": "VariableDefinition",
554554
"type": {
555555
"kind": "NamedType",
@@ -571,7 +571,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
571571
{
572572
"directives": [
573573
{
574-
"arguments": [],
574+
"arguments": undefined,
575575
"kind": "Directive",
576576
"name": {
577577
"kind": "Name",
@@ -652,7 +652,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
652652
},
653653
},
654654
],
655-
"directives": [],
655+
"directives": undefined,
656656
"kind": "Field",
657657
"name": {
658658
"kind": "Name",
@@ -671,7 +671,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
671671
},
672672
},
673673
{
674-
"directives": [],
674+
"directives": undefined,
675675
"kind": "OperationDefinition",
676676
"name": {
677677
"kind": "Name",
@@ -717,7 +717,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
717717
},
718718
},
719719
],
720-
"directives": [],
720+
"directives": undefined,
721721
"kind": "Field",
722722
"name": {
723723
"kind": "Name",
@@ -727,8 +727,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
727727
},
728728
{
729729
"alias": undefined,
730-
"arguments": [],
731-
"directives": [],
730+
"arguments": undefined,
731+
"directives": undefined,
732732
"kind": "Field",
733733
"name": {
734734
"kind": "Name",
@@ -738,10 +738,10 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
738738
},
739739
],
740740
},
741-
"variableDefinitions": [],
741+
"variableDefinitions": undefined,
742742
},
743743
{
744-
"directives": [],
744+
"directives": undefined,
745745
"kind": "OperationDefinition",
746746
"name": {
747747
"kind": "Name",
@@ -753,8 +753,8 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
753753
"selections": [
754754
{
755755
"alias": undefined,
756-
"arguments": [],
757-
"directives": [],
756+
"arguments": undefined,
757+
"directives": undefined,
758758
"kind": "Field",
759759
"name": {
760760
"kind": "Name",
@@ -764,7 +764,7 @@ exports[`parse > parses the kitchen sink document like graphql.js does 1`] = `
764764
},
765765
],
766766
},
767-
"variableDefinitions": [],
767+
"variableDefinitions": undefined,
768768
},
769769
],
770770
"kind": "Document",

0 commit comments

Comments
 (0)