Skip to content

Commit 51fa808

Browse files
committed
try incremental delivery without branching
1 parent 505d096 commit 51fa808

File tree

10 files changed

+2009
-748
lines changed

10 files changed

+2009
-748
lines changed

src/execution/__tests__/defer-test.ts

Lines changed: 215 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -311,17 +311,17 @@ describe('Execute: defer directive', () => {
311311
incremental: [
312312
{
313313
data: {
314-
friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }],
314+
name: 'Luke',
315315
},
316316
path: ['hero'],
317-
label: 'DeferNested',
317+
label: 'DeferTop',
318318
},
319319
{
320320
data: {
321-
name: 'Luke',
321+
friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }],
322322
},
323323
path: ['hero'],
324-
label: 'DeferTop',
324+
label: 'DeferNested',
325325
},
326326
],
327327
hasNext: false,
@@ -431,6 +431,217 @@ describe('Execute: defer directive', () => {
431431
},
432432
]);
433433
});
434+
435+
it('Can separately emit defer fragments with different labels with varying fields', async () => {
436+
const document = parse(`
437+
query HeroNameQuery {
438+
hero {
439+
id
440+
name
441+
... @defer(label: "DeferID") {
442+
id
443+
}
444+
... @defer(label: "DeferName") {
445+
name
446+
}
447+
}
448+
}
449+
`);
450+
const result = await complete(document);
451+
expectJSON(result).toDeepEqual([
452+
{
453+
data: {
454+
hero: {
455+
id: '1',
456+
name: 'Luke',
457+
},
458+
},
459+
hasNext: true,
460+
},
461+
{
462+
incremental: [
463+
{
464+
data: {
465+
id: '1',
466+
},
467+
path: ['hero'],
468+
label: 'DeferID',
469+
},
470+
{
471+
data: {
472+
name: 'Luke',
473+
},
474+
path: ['hero'],
475+
label: 'DeferName',
476+
},
477+
],
478+
hasNext: false,
479+
},
480+
]);
481+
});
482+
483+
it('Separately emits defer fragments with different labels with varying subfields', async () => {
484+
const document = parse(`
485+
query HeroNameQuery {
486+
hero {
487+
id
488+
name
489+
}
490+
... @defer(label: "DeferID") {
491+
hero {
492+
id
493+
}
494+
}
495+
... @defer(label: "DeferName") {
496+
hero {
497+
name
498+
}
499+
}
500+
}
501+
`);
502+
const result = await complete(document);
503+
expectJSON(result).toDeepEqual([
504+
{
505+
data: {
506+
hero: {
507+
id: '1',
508+
name: 'Luke',
509+
},
510+
},
511+
hasNext: true,
512+
},
513+
{
514+
incremental: [
515+
{
516+
data: {
517+
hero: {
518+
id: '1',
519+
},
520+
},
521+
path: [],
522+
label: 'DeferID',
523+
},
524+
{
525+
data: {
526+
hero: {
527+
name: 'Luke',
528+
},
529+
},
530+
path: [],
531+
label: 'DeferName',
532+
},
533+
],
534+
hasNext: false,
535+
},
536+
]);
537+
});
538+
539+
it('Separately emits defer fragments with varying subfields of same priorities but different level of defers', async () => {
540+
const document = parse(`
541+
query HeroNameQuery {
542+
hero {
543+
id
544+
name
545+
}
546+
hero {
547+
... @defer(label: "DeferID") {
548+
id
549+
}
550+
}
551+
... @defer(label: "DeferName") {
552+
hero {
553+
name
554+
}
555+
}
556+
}
557+
`);
558+
const result = await complete(document);
559+
expectJSON(result).toDeepEqual([
560+
{
561+
data: {
562+
hero: {
563+
id: '1',
564+
name: 'Luke',
565+
},
566+
},
567+
hasNext: true,
568+
},
569+
{
570+
incremental: [
571+
{
572+
data: {
573+
id: '1',
574+
},
575+
path: ['hero'],
576+
label: 'DeferID',
577+
},
578+
{
579+
data: {
580+
hero: {
581+
name: 'Luke',
582+
},
583+
},
584+
path: [],
585+
label: 'DeferName',
586+
},
587+
],
588+
hasNext: false,
589+
},
590+
]);
591+
});
592+
593+
it('Separately emits nested defer fragments with varying subfields of same priorities but different level of defers', async () => {
594+
const document = parse(`
595+
query HeroNameQuery {
596+
hero {
597+
id
598+
name
599+
}
600+
... @defer(label: "DeferName") {
601+
hero {
602+
name
603+
... @defer(label: "DeferID") {
604+
id
605+
}
606+
}
607+
}
608+
}
609+
`);
610+
const result = await complete(document);
611+
expectJSON(result).toDeepEqual([
612+
{
613+
data: {
614+
hero: {
615+
id: '1',
616+
name: 'Luke',
617+
},
618+
},
619+
hasNext: true,
620+
},
621+
{
622+
incremental: [
623+
{
624+
data: {
625+
id: '1',
626+
},
627+
path: ['hero'],
628+
label: 'DeferID',
629+
},
630+
{
631+
data: {
632+
hero: {
633+
name: 'Luke',
634+
},
635+
},
636+
path: [],
637+
label: 'DeferName',
638+
},
639+
],
640+
hasNext: false,
641+
},
642+
]);
643+
});
644+
434645
it('Handles errors thrown in deferred fragments', async () => {
435646
const document = parse(`
436647
query HeroNameQuery {
@@ -605,11 +816,6 @@ describe('Execute: defer directive', () => {
605816
data: { slowField: 'slow', friends: [{}, {}, {}] },
606817
path: ['hero'],
607818
},
608-
],
609-
hasNext: true,
610-
},
611-
{
612-
incremental: [
613819
{ data: { name: 'Han' }, path: ['hero', 'friends', 0] },
614820
{ data: { name: 'Leia' }, path: ['hero', 'friends', 1] },
615821
{ data: { name: 'C-3PO' }, path: ['hero', 'friends', 2] },

src/execution/__tests__/executor-test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,12 @@ describe('Execute: Handles basic execution tasks', () => {
239239
const field = operation.selectionSet.selections[0];
240240
expect(resolvedInfo).to.deep.include({
241241
fieldNodes: [field],
242-
path: { prev: undefined, key: 'result', typename: 'Test' },
242+
path: {
243+
prev: undefined,
244+
key: 'result',
245+
typename: 'Test',
246+
fieldName: 'test',
247+
},
243248
variableValues: { var: 'abc' },
244249
});
245250
});
@@ -291,12 +296,15 @@ describe('Execute: Handles basic execution tasks', () => {
291296
expect(path).to.deep.equal({
292297
key: 'l2',
293298
typename: 'SomeObject',
299+
fieldName: 'test',
294300
prev: {
295301
key: 0,
296302
typename: undefined,
303+
fieldName: undefined,
297304
prev: {
298305
key: 'l1',
299306
typename: 'SomeQuery',
307+
fieldName: 'test',
300308
prev: undefined,
301309
},
302310
},

0 commit comments

Comments
 (0)