@reventlessdev/reventless-graphql-server 1.0.0-alpha.10 → 1.0.0-alpha.101

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 CHANGED
@@ -3,6 +3,730 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 1.0.0-alpha.101 (2026-09-01)
7
+
8
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
9
+
10
+
11
+
12
+
13
+
14
+ # 1.0.0-alpha.100 (2026-09-01)
15
+
16
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
17
+
18
+
19
+
20
+
21
+
22
+ # 1.0.0-alpha.99 (2026-08-27)
23
+
24
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
25
+
26
+
27
+
28
+
29
+
30
+ # 1.0.0-alpha.98 (2026-08-23)
31
+
32
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
33
+
34
+
35
+
36
+
37
+
38
+ # 1.0.0-alpha.97 (2026-08-23)
39
+
40
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
41
+
42
+
43
+
44
+
45
+
46
+ # 1.0.0-alpha.96 (2026-08-23)
47
+
48
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
49
+
50
+
51
+
52
+
53
+
54
+ # 1.0.0-alpha.95 (2026-08-22)
55
+
56
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
57
+
58
+
59
+
60
+
61
+
62
+ # 1.0.0-alpha.94 (2026-08-21)
63
+
64
+ ### Bug Fixes
65
+
66
+ * **core:** make @resolves/[@resolves](https://github.com/resolves)Many work end to end ([4c52957](https://github.com/ReventlessDev/reventless-core/commit/4c5295759dcb4b3eda4f0f4f2c1bc387fed88fcb))
67
+
68
+
69
+ # 1.0.0-alpha.93 (2026-08-20)
70
+
71
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
72
+
73
+
74
+
75
+
76
+
77
+ # 1.0.0-alpha.92 (2026-08-20)
78
+
79
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
80
+
81
+
82
+
83
+
84
+
85
+ # 1.0.0-alpha.91 (2026-08-20)
86
+
87
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
88
+
89
+
90
+
91
+
92
+
93
+ # 1.0.0-alpha.90 (2026-08-20)
94
+
95
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
96
+
97
+
98
+
99
+
100
+
101
+ # 1.0.0-alpha.89 (2026-08-19)
102
+
103
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
104
+
105
+
106
+
107
+
108
+
109
+ # 1.0.0-alpha.88 (2026-08-18)
110
+
111
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
112
+
113
+
114
+
115
+
116
+
117
+ # 1.0.0-alpha.87 (2026-08-18)
118
+
119
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
120
+
121
+
122
+
123
+
124
+
125
+ # 1.0.0-alpha.86 (2026-08-16)
126
+
127
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
128
+
129
+
130
+
131
+
132
+
133
+ # 1.0.0-alpha.85 (2026-08-16)
134
+
135
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
136
+
137
+
138
+
139
+
140
+
141
+ # 1.0.0-alpha.84 (2026-08-15)
142
+
143
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
144
+
145
+
146
+
147
+
148
+
149
+ # 1.0.0-alpha.83 (2026-08-15)
150
+
151
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
152
+
153
+
154
+
155
+
156
+
157
+ # 1.0.0-alpha.82 (2026-08-14)
158
+
159
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
160
+
161
+
162
+
163
+
164
+
165
+ # 1.0.0-alpha.81 (2026-08-14)
166
+
167
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
168
+
169
+
170
+
171
+
172
+
173
+ # 1.0.0-alpha.80 (2026-08-13)
174
+
175
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
176
+
177
+
178
+
179
+
180
+
181
+ # 1.0.0-alpha.79 (2026-08-13)
182
+
183
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
184
+
185
+
186
+
187
+
188
+
189
+ # 1.0.0-alpha.78 (2026-08-13)
190
+
191
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
192
+
193
+
194
+
195
+
196
+
197
+ # 1.0.0-alpha.77 (2026-08-12)
198
+
199
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
200
+
201
+
202
+
203
+
204
+
205
+ # 1.0.0-alpha.76 (2026-08-12)
206
+
207
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
208
+
209
+
210
+
211
+
212
+
213
+ # 1.0.0-alpha.75 (2026-08-12)
214
+
215
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
216
+
217
+
218
+
219
+
220
+
221
+ # 1.0.0-alpha.74 (2026-08-12)
222
+
223
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
224
+
225
+
226
+
227
+
228
+
229
+ # 1.0.0-alpha.73 (2026-08-12)
230
+
231
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
232
+
233
+
234
+
235
+
236
+
237
+ # 1.0.0-alpha.72 (2026-08-11)
238
+
239
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
240
+
241
+
242
+
243
+
244
+
245
+ # 1.0.0-alpha.71 (2026-08-10)
246
+
247
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
248
+
249
+
250
+
251
+
252
+
253
+ # 1.0.0-alpha.70 (2026-08-10)
254
+
255
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
256
+
257
+
258
+
259
+
260
+
261
+ # 1.0.0-alpha.69 (2026-08-09)
262
+
263
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
264
+
265
+
266
+
267
+
268
+
269
+ # 1.0.0-alpha.68 (2026-08-09)
270
+
271
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
272
+
273
+
274
+
275
+
276
+
277
+ # 1.0.0-alpha.67 (2026-08-09)
278
+
279
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
280
+
281
+
282
+
283
+
284
+
285
+ # 1.0.0-alpha.66 (2026-08-09)
286
+
287
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
288
+
289
+
290
+
291
+
292
+
293
+ # 1.0.0-alpha.65 (2026-08-08)
294
+
295
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
296
+
297
+
298
+
299
+
300
+
301
+ # 1.0.0-alpha.64 (2026-08-08)
302
+
303
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
304
+
305
+
306
+
307
+
308
+
309
+ # 1.0.0-alpha.63 (2026-08-08)
310
+
311
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
312
+
313
+
314
+
315
+
316
+
317
+ # 1.0.0-alpha.62 (2026-08-07)
318
+
319
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
320
+
321
+
322
+
323
+
324
+
325
+ # 1.0.0-alpha.61 (2026-08-05)
326
+
327
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
328
+
329
+
330
+
331
+
332
+
333
+ # 1.0.0-alpha.60 (2026-08-04)
334
+
335
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
336
+
337
+
338
+
339
+
340
+
341
+ # 1.0.0-alpha.59 (2026-08-04)
342
+
343
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
344
+
345
+
346
+
347
+
348
+
349
+ # 1.0.0-alpha.58 (2026-08-04)
350
+
351
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
352
+
353
+
354
+
355
+
356
+
357
+ # 1.0.0-alpha.57 (2026-08-03)
358
+
359
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
360
+
361
+
362
+
363
+
364
+
365
+ # 1.0.0-alpha.56 (2026-08-03)
366
+
367
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
368
+
369
+
370
+
371
+
372
+
373
+ # 1.0.0-alpha.55 (2026-08-03)
374
+
375
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
376
+
377
+
378
+
379
+
380
+
381
+ # 1.0.0-alpha.54 (2026-08-03)
382
+
383
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
384
+
385
+
386
+
387
+
388
+
389
+ # 1.0.0-alpha.53 (2026-08-02)
390
+
391
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
392
+
393
+
394
+
395
+
396
+
397
+ # 1.0.0-alpha.52 (2026-08-02)
398
+
399
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
400
+
401
+
402
+
403
+
404
+
405
+ # 1.0.0-alpha.51 (2026-08-02)
406
+
407
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
408
+
409
+
410
+
411
+
412
+
413
+ # 1.0.0-alpha.50 (2026-08-02)
414
+
415
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
416
+
417
+
418
+
419
+
420
+
421
+ # 1.0.0-alpha.49 (2026-08-02)
422
+
423
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
424
+
425
+
426
+
427
+
428
+
429
+ # 1.0.0-alpha.48 (2026-08-01)
430
+
431
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
432
+
433
+
434
+
435
+
436
+
437
+ # 1.0.0-alpha.47 (2026-08-01)
438
+
439
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
440
+
441
+
442
+
443
+
444
+
445
+ # 1.0.0-alpha.46 (2026-08-01)
446
+
447
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
448
+
449
+
450
+
451
+
452
+
453
+ # 1.0.0-alpha.45 (2026-08-01)
454
+
455
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
456
+
457
+
458
+
459
+
460
+
461
+ # 1.0.0-alpha.44 (2026-07-31)
462
+
463
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
464
+
465
+
466
+
467
+
468
+
469
+ # 1.0.0-alpha.43 (2026-07-30)
470
+
471
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
472
+
473
+
474
+
475
+
476
+
477
+ # 1.0.0-alpha.42 (2026-07-30)
478
+
479
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
480
+
481
+
482
+
483
+
484
+
485
+ # 1.0.0-alpha.41 (2026-07-30)
486
+
487
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
488
+
489
+
490
+
491
+
492
+
493
+ # 1.0.0-alpha.40 (2026-07-30)
494
+
495
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
496
+
497
+
498
+
499
+
500
+
501
+ # 1.0.0-alpha.39 (2026-07-29)
502
+
503
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
504
+
505
+
506
+
507
+
508
+
509
+ # 1.0.0-alpha.38 (2026-07-28)
510
+
511
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
512
+
513
+
514
+
515
+
516
+
517
+ # 1.0.0-alpha.37 (2026-07-28)
518
+
519
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
520
+
521
+
522
+
523
+
524
+
525
+ # 1.0.0-alpha.36 (2026-07-28)
526
+
527
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
528
+
529
+
530
+
531
+
532
+
533
+ # 1.0.0-alpha.35 (2026-07-28)
534
+
535
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
536
+
537
+
538
+
539
+
540
+
541
+ # 1.0.0-alpha.34 (2026-07-27)
542
+
543
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
544
+
545
+
546
+
547
+
548
+
549
+ # 1.0.0-alpha.33 (2026-07-27)
550
+
551
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
552
+
553
+
554
+
555
+
556
+
557
+ # 1.0.0-alpha.32 (2026-07-27)
558
+
559
+ ### Bug Fixes
560
+
561
+ * **graphql:** keep a repeat mutation registration from duplicating SDL ([b54e844](https://github.com/ReventlessDev/reventless-core/commit/b54e8446236e16196a40a1a7df9f7ba84b03b167))
562
+
563
+
564
+ # 1.0.0-alpha.31 (2026-07-27)
565
+
566
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
567
+
568
+
569
+
570
+
571
+
572
+ # 1.0.0-alpha.30 (2026-07-27)
573
+
574
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
575
+
576
+
577
+
578
+
579
+
580
+ # 1.0.0-alpha.29 (2026-07-26)
581
+
582
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
583
+
584
+
585
+
586
+
587
+
588
+ # 1.0.0-alpha.28 (2026-07-26)
589
+
590
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
591
+
592
+
593
+
594
+
595
+
596
+ # 1.0.0-alpha.27 (2026-07-24)
597
+
598
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
599
+
600
+
601
+
602
+
603
+
604
+ # 1.0.0-alpha.26 (2026-07-23)
605
+
606
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
607
+
608
+
609
+
610
+
611
+
612
+ # 1.0.0-alpha.25 (2026-07-22)
613
+
614
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
615
+
616
+
617
+
618
+
619
+
620
+ # 1.0.0-alpha.24 (2026-07-22)
621
+
622
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
623
+
624
+
625
+
626
+
627
+
628
+ # 1.0.0-alpha.23 (2026-07-22)
629
+
630
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
631
+
632
+
633
+
634
+
635
+
636
+ # 1.0.0-alpha.22 (2026-07-22)
637
+
638
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
639
+
640
+
641
+
642
+
643
+
644
+ # 1.0.0-alpha.21 (2026-07-21)
645
+
646
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
647
+
648
+
649
+
650
+
651
+
652
+ # 1.0.0-alpha.20 (2026-07-20)
653
+
654
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
655
+
656
+
657
+
658
+
659
+
660
+ # 1.0.0-alpha.19 (2026-07-17)
661
+
662
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
663
+
664
+
665
+
666
+
667
+
668
+ # 1.0.0-alpha.18 (2026-07-17)
669
+
670
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
671
+
672
+
673
+
674
+
675
+
676
+ # 1.0.0-alpha.17 (2026-07-16)
677
+
678
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
679
+
680
+
681
+
682
+
683
+
684
+ # 1.0.0-alpha.16 (2026-07-15)
685
+
686
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
687
+
688
+
689
+
690
+
691
+
692
+ # 1.0.0-alpha.15 (2026-07-14)
693
+
694
+ ### Features
695
+
696
+ * surface masked GraphQL resolver errors server-side (local + AWS) ([b3bca51](https://github.com/ReventlessDev/reventless-core/commit/b3bca51b539e40c604b3db338d570de6215ea837))
697
+
698
+
699
+ # 1.0.0-alpha.14 (2026-07-14)
700
+
701
+ ### Features
702
+
703
+ * **local:** plugin=subgraph composition — per-plugin subschemas merged at start (Phase 6, plan complete) ([40f44c5](https://github.com/ReventlessDev/reventless-core/commit/40f44c5c6aa32fbbd64f362841cf41ba4e2fc2e0))
704
+
705
+
706
+ # 1.0.0-alpha.13 (2026-07-14)
707
+
708
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
709
+
710
+
711
+
712
+
713
+
714
+ # 1.0.0-alpha.12 (2026-07-13)
715
+
716
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
717
+
718
+
719
+
720
+
721
+
722
+ # 1.0.0-alpha.11 (2026-07-13)
723
+
724
+ **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
725
+
726
+
727
+
728
+
729
+
6
730
  # 1.0.0-alpha.10 (2026-07-13)
7
731
 
8
732
  **Note:** Version bump only for package @reventlessdev/reventless-graphql-server
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-graphql-server",
3
- "version": "1.0.0-alpha.10",
3
+ "version": "1.0.0-alpha.101",
4
4
  "description": "Transport-neutral GraphQL server runtime for Reventless: schema-from-fragments, resolver registration, an HTTP + graphql-ws listener, and a subscription fan-out bridge with a pluggable PubSub backend",
5
5
  "license": "Apache-2.0",
6
6
  "dependencies": {
7
- "@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.20",
8
- "@reventlessdev/reventless-core": "3.0.0-alpha.163"
7
+ "@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.27",
8
+ "@reventlessdev/reventless-core": "3.0.0-alpha.253"
9
9
  },
10
10
  "devDependencies": {
11
- "rescript": "^12.3.0"
11
+ "rescript": "12.3.0"
12
12
  },
13
13
  "peerDependencies": {
14
- "rescript": "^12.3.0"
14
+ "rescript": "12.3.0"
15
15
  },
16
16
  "publishConfig": {
17
17
  "registry": "https://registry.npmjs.org"
@@ -19,7 +19,7 @@
19
19
  "repository": {
20
20
  "type": "git",
21
21
  "url": "git+https://github.com/ReventlessDev/reventless-core.git",
22
- "directory": "reventless/reventless-graphql-server"
22
+ "directory": "reventless/graphql-server"
23
23
  },
24
24
  "scripts": {
25
25
  "build": "rescript build",
@@ -42,6 +42,11 @@ type t = {
42
42
  registerQueries: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
43
43
  registerSubscriptions: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
44
44
  registerTypes: (~sdlTypes: array<string>) => unit,
45
+ /** Resolvers for fields of an object type rather than of a root type — the
46
+ cross-table fields `@resolves` / `@resolvesMany` add to a queryable. The
47
+ SDL for those fields comes from the plugin's schema fragment, so only the
48
+ resolver map is registered here. */
49
+ registerFieldResolvers: (~typeName: string, ~resolvers: dict<resolverFn>) => unit,
45
50
  getMutationResolver: string => option<resolverFn>,
46
51
  getQueryResolver: string => option<resolverFn>,
47
52
  // `~contextFactory` is the yoga context factory — when supplied, requests
@@ -76,6 +81,7 @@ let make = (~label: string="GraphQL"): t => {
76
81
  let mutationResolvers: ref<dict<resolverFn>> = ref(Dict.make())
77
82
  let queryResolvers: ref<dict<resolverFn>> = ref(Dict.make())
78
83
  let subscriptionResolvers: ref<dict<resolverFn>> = ref(Dict.make())
84
+ let fieldResolvers: ref<dict<dict<resolverFn>>> = ref(Dict.make())
79
85
  let mutationFields: ref<array<string>> = ref([])
80
86
  let queryFields: ref<array<string>> = ref([])
81
87
  let subscriptionFields: ref<array<string>> = ref([])
@@ -85,7 +91,16 @@ let make = (~label: string="GraphQL"): t => {
85
91
  let lastFullSdl: ref<option<string>> = ref(None)
86
92
 
87
93
  let registerMutations = (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => {
88
- mutationFields.contents = mutationFields.contents->Array.concat(sdlFields)
94
+ // A mutation field has two legitimate writers: the admin base fragment
95
+ // carries the Plugin aggregate's lifecycle fields, and the aggregate
96
+ // auto-flow registers the same fields when the admin is constructed again
97
+ // for a later deploy onto the same server. buildASTSchema rejects a schema
98
+ // that defines a field twice, so keep the first SDL definition and drop
99
+ // repeats by field name — mirroring the resolver dict, where a repeat
100
+ // registration overwrites by key (last resolver wins).
101
+ let existing = Set.fromArray(mutationFields.contents->Array.map(extractFieldName))
102
+ let fresh = sdlFields->Array.filter(f => !(existing->Set.has(extractFieldName(f))))
103
+ mutationFields.contents = mutationFields.contents->Array.concat(fresh)
89
104
  resolvers->Dict.toArray->Array.forEach(((k, v)) => mutationResolvers.contents->Dict.set(k, v))
90
105
  }
91
106
 
@@ -101,8 +116,26 @@ let make = (~label: string="GraphQL"): t => {
101
116
  )
102
117
  }
103
118
 
119
+ let registerFieldResolvers = (~typeName: string, ~resolvers: dict<resolverFn>) => {
120
+ let forType = switch fieldResolvers.contents->Dict.get(typeName) {
121
+ | Some(d) => d
122
+ | None =>
123
+ let d = Dict.make()
124
+ fieldResolvers.contents->Dict.set(typeName, d)
125
+ d
126
+ }
127
+ resolvers->Dict.toArray->Array.forEach(((k, v)) => forType->Dict.set(k, v))
128
+ }
129
+
130
+ // Identical type blocks dedupe: shared-type registrations (e.g. the
131
+ // CommandResult union family) may be repeated by every component that needs
132
+ // them; a duplicate definition in one document would fail createSchema.
104
133
  let registerTypes = (~sdlTypes: array<string>) => {
105
- typeDefinitions.contents = typeDefinitions.contents->Array.concat(sdlTypes)
134
+ sdlTypes->Array.forEach(t =>
135
+ if !(typeDefinitions.contents->Array.includes(t)) {
136
+ typeDefinitions.contents->Array.push(t)
137
+ }
138
+ )
106
139
  }
107
140
 
108
141
  let getMutationResolver = (fieldName: string): option<resolverFn> =>
@@ -157,16 +190,29 @@ ${mutations}
157
190
  if subscriptionResolvers.contents->Dict.keysToArray->Array.length > 0 {
158
191
  resolvers->Dict.set("Subscription", subscriptionResolvers.contents)
159
192
  }
193
+ fieldResolvers.contents
194
+ ->Dict.toArray
195
+ ->Array.forEach(((typeName, byField)) => resolvers->Dict.set(typeName, byField))
160
196
  let sdl = buildSdl()
161
197
  lastFullSdl.contents = Some(sdl)
162
198
  let schema = YG.createSchema({"typeDefs": sdl, "resolvers": resolvers})
163
199
  activeSchema.contents = Some(schema)
200
+ // Route yoga's own logging into the framework logger. error/warn ALWAYS
201
+ // surface (so a masked resolver failure — which yoga reports via logger.error
202
+ // with the original Error even when the client response is masked — is never
203
+ // swallowed), while verbose debug/info stay gated on GRAPHQL_DEBUG.
204
+ let yogaLogging: YG.yogaLogger = {
205
+ debug: a => if debug { log.debug(~comp=label, YG.logArgToString(a)) },
206
+ info: a => if debug { log.info(~comp=label, YG.logArgToString(a)) },
207
+ warn: a => log.warn(~comp=label, YG.logArgToString(a)),
208
+ error: a => log.error(~comp=label, YG.logArgToString(a)),
209
+ }
164
210
  let yoga = switch contextFactory {
165
211
  | Some(ctx) =>
166
212
  YG.createYogaWithContext({
167
213
  "schema": schema,
168
214
  "graphiql": true,
169
- "logging": debug,
215
+ "logging": yogaLogging,
170
216
  "maskedErrors": !debug,
171
217
  "context": ctx,
172
218
  })
@@ -174,7 +220,7 @@ ${mutations}
174
220
  YG.createYoga({
175
221
  "schema": schema,
176
222
  "graphiql": true,
177
- "logging": debug,
223
+ "logging": yogaLogging,
178
224
  "maskedErrors": !debug,
179
225
  })
180
226
  }
@@ -194,6 +240,7 @@ ${mutations}
194
240
  mutationResolvers.contents = Dict.make()
195
241
  queryResolvers.contents = Dict.make()
196
242
  subscriptionResolvers.contents = Dict.make()
243
+ fieldResolvers.contents = Dict.make()
197
244
  mutationFields.contents = []
198
245
  queryFields.contents = []
199
246
  subscriptionFields.contents = []
@@ -292,6 +339,7 @@ ${mutations}
292
339
  registerQueries,
293
340
  registerSubscriptions,
294
341
  registerTypes,
342
+ registerFieldResolvers,
295
343
  getMutationResolver,
296
344
  getQueryResolver,
297
345
  start,
@@ -2,7 +2,8 @@
2
2
 
3
3
  import * as Ws from "ws";
4
4
  import * as Http from "http";
5
- import * as GraphqlYoga from "graphql-yoga";
5
+ import * as GraphqlYoga from "@reventlessdev/rescript-graphql-yoga/src/GraphqlYoga.res.mjs";
6
+ import * as GraphqlYoga$1 from "graphql-yoga";
6
7
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
7
8
  import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
8
9
  import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
@@ -29,6 +30,9 @@ function make(labelOpt) {
29
30
  let subscriptionResolvers = {
30
31
  contents: {}
31
32
  };
33
+ let fieldResolvers = {
34
+ contents: {}
35
+ };
32
36
  let mutationFields = {
33
37
  contents: []
34
38
  };
@@ -51,7 +55,9 @@ function make(labelOpt) {
51
55
  contents: undefined
52
56
  };
53
57
  let registerMutations = (sdlFields, resolvers) => {
54
- mutationFields.contents = mutationFields.contents.concat(sdlFields);
58
+ let existing = new Set(mutationFields.contents.map(extractFieldName));
59
+ let fresh = sdlFields.filter(f => !existing.has(extractFieldName(f)));
60
+ mutationFields.contents = mutationFields.contents.concat(fresh);
55
61
  Object.entries(resolvers).forEach(param => {
56
62
  mutationResolvers.contents[param[0]] = param[1];
57
63
  });
@@ -68,8 +74,27 @@ function make(labelOpt) {
68
74
  subscriptionResolvers.contents[param[0]] = param[1];
69
75
  });
70
76
  };
77
+ let registerFieldResolvers = (typeName, resolvers) => {
78
+ let d = fieldResolvers.contents[typeName];
79
+ let forType;
80
+ if (d !== undefined) {
81
+ forType = d;
82
+ } else {
83
+ let d$1 = {};
84
+ fieldResolvers.contents[typeName] = d$1;
85
+ forType = d$1;
86
+ }
87
+ Object.entries(resolvers).forEach(param => {
88
+ forType[param[0]] = param[1];
89
+ });
90
+ };
71
91
  let registerTypes = sdlTypes => {
72
- typeDefinitions.contents = typeDefinitions.contents.concat(sdlTypes);
92
+ sdlTypes.forEach(t => {
93
+ if (!typeDefinitions.contents.includes(t)) {
94
+ typeDefinitions.contents.push(t);
95
+ return;
96
+ }
97
+ });
73
98
  };
74
99
  let getMutationResolver = fieldName => mutationResolvers.contents[fieldName];
75
100
  let getQueryResolver = fieldName => queryResolvers.contents[fieldName];
@@ -104,23 +129,44 @@ type Mutation {
104
129
  if (Object.keys(subscriptionResolvers.contents).length !== 0) {
105
130
  resolvers["Subscription"] = subscriptionResolvers.contents;
106
131
  }
132
+ Object.entries(fieldResolvers.contents).forEach(param => {
133
+ resolvers[param[0]] = param[1];
134
+ });
107
135
  let sdl = buildSdl();
108
136
  lastFullSdl.contents = sdl;
109
- let schema = GraphqlYoga.createSchema({
137
+ let schema = GraphqlYoga$1.createSchema({
110
138
  typeDefs: sdl,
111
139
  resolvers: resolvers
112
140
  });
113
141
  activeSchema.contents = Primitive_option.some(schema);
114
- let yoga = contextFactory !== undefined ? GraphqlYoga.createYoga({
142
+ let yogaLogging_debug = a => {
143
+ if (debug) {
144
+ return log.debug(label, undefined, GraphqlYoga.logArgToString(a));
145
+ }
146
+ };
147
+ let yogaLogging_info = a => {
148
+ if (debug) {
149
+ return log.info(label, undefined, GraphqlYoga.logArgToString(a));
150
+ }
151
+ };
152
+ let yogaLogging_warn = a => log.warn(label, undefined, GraphqlYoga.logArgToString(a));
153
+ let yogaLogging_error = a => log.error(label, undefined, GraphqlYoga.logArgToString(a));
154
+ let yogaLogging = {
155
+ debug: yogaLogging_debug,
156
+ info: yogaLogging_info,
157
+ warn: yogaLogging_warn,
158
+ error: yogaLogging_error
159
+ };
160
+ let yoga = contextFactory !== undefined ? GraphqlYoga$1.createYoga({
115
161
  schema: schema,
116
162
  graphiql: true,
117
- logging: debug,
163
+ logging: yogaLogging,
118
164
  maskedErrors: !debug,
119
165
  context: contextFactory
120
- }) : GraphqlYoga.createYoga({
166
+ }) : GraphqlYoga$1.createYoga({
121
167
  schema: schema,
122
168
  graphiql: true,
123
- logging: debug,
169
+ logging: yogaLogging,
124
170
  maskedErrors: !debug
125
171
  });
126
172
  let server = Http.createServer(yoga);
@@ -141,6 +187,7 @@ type Mutation {
141
187
  mutationResolvers.contents = {};
142
188
  queryResolvers.contents = {};
143
189
  subscriptionResolvers.contents = {};
190
+ fieldResolvers.contents = {};
144
191
  mutationFields.contents = [];
145
192
  queryFields.contents = [];
146
193
  subscriptionFields.contents = [];
@@ -232,6 +279,7 @@ type Mutation {
232
279
  registerQueries: registerQueries,
233
280
  registerSubscriptions: registerSubscriptions,
234
281
  registerTypes: registerTypes,
282
+ registerFieldResolvers: registerFieldResolvers,
235
283
  getMutationResolver: getMutationResolver,
236
284
  getQueryResolver: getQueryResolver,
237
285
  start: start,