From fe124dea2086de18bd61f575a3a12293bf895181 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Thu, 18 Apr 2024 22:35:44 +0200 Subject: [PATCH] fix(ts-client): args on interfaces and unions (#781) --- src/client/SelectionSet/SelectionSet.test-d.ts | 3 +++ src/client/SelectionSet/SelectionSet.ts | 4 ++-- src/client/client.ts | 2 +- src/generator/__snapshots__/files.test.ts.snap | 14 ++++++++++++++ tests/ts/_/schema/generated/SchemaBuildtime.ts | 12 ++++++++++++ tests/ts/_/schema/generated/SchemaRuntime.ts | 2 ++ tests/ts/_/schema/schema.graphql | 2 ++ 7 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/client/SelectionSet/SelectionSet.test-d.ts b/src/client/SelectionSet/SelectionSet.test-d.ts index 7fd61ab87..fd5972ada 100644 --- a/src/client/SelectionSet/SelectionSet.test-d.ts +++ b/src/client/SelectionSet/SelectionSet.test-d.ts @@ -74,6 +74,7 @@ test(`Query`, () => { assertType({ interface: { __typename: true } }) assertType({ interface: { __typename: { $defer: true } } }) assertType({ interface: { $scalars: true } }) + assertType({ interfaceWithArgs: { $: { id: `abc` }, id: true } }) // @ts-expect-error needs fragment assertType({ interface: { id: true, int: true } }) // @ts-expect-error needs fragment @@ -224,6 +225,8 @@ test(`Query`, () => { assertType({ scalars: { $scalars: { $skip: true } } }) // union fragment assertType({ fooBarUnion: { onBar: { $scalars: true } } }) + assertType({ unionFooBarWithArgs: { $: { id: `abc` }, onBar: { $scalars: true } } }) + // assertType({ scalars: select() }) // todo empty selection set not allowed, with arguments given diff --git a/src/client/SelectionSet/SelectionSet.ts b/src/client/SelectionSet/SelectionSet.ts index 86246df7b..5d035b391 100644 --- a/src/client/SelectionSet/SelectionSet.ts +++ b/src/client/SelectionSet/SelectionSet.ts @@ -91,8 +91,8 @@ export type Field_< $type extends Schema.Scalar.Any ? Indicator<$Field> : $type extends Schema.Enum ? Indicator<$Field> : $type extends Schema.Object$2 ? Object<$type, $Index> & ($Options['hideDirectives'] extends true ? {} : FieldDirectives) & Arguments<$Field> : - $type extends Schema.Union ? Union<$type, $Index> : - $type extends Schema.Interface ? Interface<$type, $Index> : + $type extends Schema.Union ? Union<$type, $Index> & Arguments<$Field> : + $type extends Schema.Interface ? Interface<$type, $Index> & Arguments<$Field> : TSError<'Field', '$Field case not handled', { $Field: $Field }> // dprint-ignore type Arguments<$Field extends SomeField> = diff --git a/src/client/client.ts b/src/client/client.ts index 5b0b1f03e..eb5c87882 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -88,7 +88,7 @@ type ValidateDocumentOperationNames<$Document> = string | number extends keyof $Document ? $Document : keyof { [K in keyof $Document & string as Schema.Named.NameParse extends never ? K : never]: K } extends never - ? $Document + ? $Document : TSError<'ValidateDocumentOperationNames', `One or more Invalid operation name in document: ${keyof { [K in keyof $Document & string as Schema.Named.NameParse extends never ? K : never]: K }}`> // dprint-ignore diff --git a/src/generator/__snapshots__/files.test.ts.snap b/src/generator/__snapshots__/files.test.ts.snap index e370c91ec..9f0dadb98 100644 --- a/src/generator/__snapshots__/files.test.ts.snap +++ b/src/generator/__snapshots__/files.test.ts.snap @@ -143,8 +143,20 @@ export namespace Root { abcEnum: $.Field<$.Output.Nullable, null> lowerCaseUnion: $.Field<$.Output.Nullable, null> interface: $.Field<$.Output.Nullable, null> + interfaceWithArgs: $.Field< + $.Output.Nullable, + $.Args<{ + id: $Scalar.ID + }> + > interfaceNonNull: $.Field unionFooBar: $.Field<$.Output.Nullable, null> + unionFooBarWithArgs: $.Field< + $.Output.Nullable, + $.Args<{ + id: $.Input.Nullable<$Scalar.ID> + }> + > unionObject: $.Field<$.Output.Nullable, null> unionFooBarNonNull: $.Field unionObjectNonNull: $.Field @@ -476,8 +488,10 @@ export const Query = $.Object$(\`Query\`, { abcEnum: $.field($.Output.Nullable(ABCEnum)), lowerCaseUnion: $.field($.Output.Nullable(() => lowerCaseUnion)), interface: $.field($.Output.Nullable(() => Interface)), + interfaceWithArgs: $.field($.Output.Nullable(() => Interface), $.Args({ id: $Scalar.ID })), interfaceNonNull: $.field(() => Interface), unionFooBar: $.field($.Output.Nullable(() => FooBarUnion)), + unionFooBarWithArgs: $.field($.Output.Nullable(() => FooBarUnion), $.Args({ id: $.Input.Nullable($Scalar.ID) })), unionObject: $.field($.Output.Nullable(() => ObjectUnion)), unionFooBarNonNull: $.field(() => FooBarUnion), unionObjectNonNull: $.field(() => ObjectUnion), diff --git a/tests/ts/_/schema/generated/SchemaBuildtime.ts b/tests/ts/_/schema/generated/SchemaBuildtime.ts index c99523304..bf076a74f 100644 --- a/tests/ts/_/schema/generated/SchemaBuildtime.ts +++ b/tests/ts/_/schema/generated/SchemaBuildtime.ts @@ -140,8 +140,20 @@ export namespace Root { abcEnum: $.Field<$.Output.Nullable, null> lowerCaseUnion: $.Field<$.Output.Nullable, null> interface: $.Field<$.Output.Nullable, null> + interfaceWithArgs: $.Field< + $.Output.Nullable, + $.Args<{ + id: $Scalar.ID + }> + > interfaceNonNull: $.Field unionFooBar: $.Field<$.Output.Nullable, null> + unionFooBarWithArgs: $.Field< + $.Output.Nullable, + $.Args<{ + id: $.Input.Nullable<$Scalar.ID> + }> + > unionObject: $.Field<$.Output.Nullable, null> unionFooBarNonNull: $.Field unionObjectNonNull: $.Field diff --git a/tests/ts/_/schema/generated/SchemaRuntime.ts b/tests/ts/_/schema/generated/SchemaRuntime.ts index f125d3985..2d59903fa 100644 --- a/tests/ts/_/schema/generated/SchemaRuntime.ts +++ b/tests/ts/_/schema/generated/SchemaRuntime.ts @@ -175,8 +175,10 @@ export const Query = $.Object$(`Query`, { abcEnum: $.field($.Output.Nullable(ABCEnum)), lowerCaseUnion: $.field($.Output.Nullable(() => lowerCaseUnion)), interface: $.field($.Output.Nullable(() => Interface)), + interfaceWithArgs: $.field($.Output.Nullable(() => Interface), $.Args({ id: $Scalar.ID })), interfaceNonNull: $.field(() => Interface), unionFooBar: $.field($.Output.Nullable(() => FooBarUnion)), + unionFooBarWithArgs: $.field($.Output.Nullable(() => FooBarUnion), $.Args({ id: $.Input.Nullable($Scalar.ID) })), unionObject: $.field($.Output.Nullable(() => ObjectUnion)), unionFooBarNonNull: $.field(() => FooBarUnion), unionObjectNonNull: $.field(() => ObjectUnion), diff --git a/tests/ts/_/schema/schema.graphql b/tests/ts/_/schema/schema.graphql index 82cb36605..a8f415316 100644 --- a/tests/ts/_/schema/schema.graphql +++ b/tests/ts/_/schema/schema.graphql @@ -53,9 +53,11 @@ type Query { lowerCaseUnion: lowerCaseUnion # Interface interface: Interface + interfaceWithArgs(id:ID!): Interface interfaceNonNull: Interface! # Union unionFooBar: FooBarUnion + unionFooBarWithArgs(id:ID): FooBarUnion unionObject: ObjectUnion unionFooBarNonNull: FooBarUnion! unionObjectNonNull: ObjectUnion!