Skip to content

Commit

Permalink
fix(ts-client): order independent input object defs
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonkuhrt committed Apr 14, 2024
1 parent 54d2810 commit 310f10c
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 2 deletions.
15 changes: 15 additions & 0 deletions src/generator/__snapshots__/files.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ export namespace Root {
input: $.Input.Nullable<InputObject.InputObjectNested>
}>
>
InputObjectNestedNonNull: $.Field<
$.Output.Nullable<$Scalar.ID>,
$.Args<{
input: InputObject.InputObjectNested
}>
>
id: $.Field<$.Output.Nullable<$Scalar.ID>, null>
idNonNull: $.Field<$Scalar.ID, null>
string: $.Field<$.Output.Nullable<$Scalar.String>, null>
Expand Down Expand Up @@ -170,6 +176,10 @@ export namespace InputObject {
InputObject: $.Input.Nullable<InputObject.InputObject>
}>
export type InputObjectNestedNonNull = $.InputObject<'InputObjectNestedNonNull', {
InputObject: InputObject.InputObject
}>
export type InputObject = $.InputObject<'InputObject', {
id: $.Input.Nullable<$Scalar.ID>
idRequired: $Scalar.ID
Expand Down Expand Up @@ -298,6 +308,10 @@ export const InputObjectNested = $.InputObject(\`InputObjectNested\`, {
InputObject: $.Input.field(() => $.Input.Nullable(InputObject)),
})
export const InputObjectNestedNonNull = $.InputObject(\`InputObjectNestedNonNull\`, {
InputObject: $.Input.field(() => InputObject),
})
export const InputObject = $.InputObject(\`InputObject\`, {
id: $.Input.field($.Input.Nullable($Scalar.ID)),
idRequired: $.Input.field($Scalar.ID),
Expand Down Expand Up @@ -415,6 +429,7 @@ export const Query = $.Object$(\`Query\`, {
dateArgNonNullListNonNull: $.field($.Output.Nullable($Scalar.Date), $.Args({ date: $.Input.List($Scalar.Date) })),
dateArgInputObject: $.field($.Output.Nullable($Scalar.Date), $.Args({ input: $.Input.Nullable(InputObject) })),
InputObjectNested: $.field($.Output.Nullable($Scalar.ID), $.Args({ input: $.Input.Nullable(InputObjectNested) })),
InputObjectNestedNonNull: $.field($.Output.Nullable($Scalar.ID), $.Args({ input: InputObjectNested })),
id: $.field($.Output.Nullable($Scalar.ID)),
idNonNull: $.field($Scalar.ID),
string: $.field($.Output.Nullable($Scalar.String)),
Expand Down
6 changes: 4 additions & 2 deletions src/generator/code/schemaRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
isUnionType,
} from 'graphql'
import type { AnyClass, AnyGraphQLOutputField } from '../../lib/graphql.js'
import { hasMutation, hasQuery, hasSubscription, unwrapToNonNull } from '../../lib/graphql.js'
import { hasMutation, hasQuery, hasSubscription, unwrapToNamed, unwrapToNonNull } from '../../lib/graphql.js'
import type { Config } from './code.js'

export const generateRuntimeSchema = (
Expand Down Expand Up @@ -116,10 +116,12 @@ const inputObject = (config: Config, type: GraphQLInputObjectType) => {
})
`
}
unwrapToNamed

const inputField = (config: Config, field: GraphQLInputField): string => {
const type = buildType(`input`, config, field.type)
return `$.Input.field(${isInputObjectType(field.type) ? `() => ${type}` : type})`
const isNeedThunk = isInputObjectType(unwrapToNamed(field.type))
return `$.Input.field(${isNeedThunk ? `() => ${type}` : type})`
}

const outputField = (config: Config, field: AnyGraphQLOutputField): string => {
Expand Down
10 changes: 10 additions & 0 deletions tests/ts/_/schema/generated/SchemaBuildtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ export namespace Root {
input: $.Input.Nullable<InputObject.InputObjectNested>
}>
>
InputObjectNestedNonNull: $.Field<
$.Output.Nullable<$Scalar.ID>,
$.Args<{
input: InputObject.InputObjectNested
}>
>
id: $.Field<$.Output.Nullable<$Scalar.ID>, null>
idNonNull: $.Field<$Scalar.ID, null>
string: $.Field<$.Output.Nullable<$Scalar.String>, null>
Expand Down Expand Up @@ -167,6 +173,10 @@ export namespace InputObject {
InputObject: $.Input.Nullable<InputObject.InputObject>
}>

export type InputObjectNestedNonNull = $.InputObject<'InputObjectNestedNonNull', {
InputObject: InputObject.InputObject
}>

export type InputObject = $.InputObject<'InputObject', {
id: $.Input.Nullable<$Scalar.ID>
idRequired: $Scalar.ID
Expand Down
5 changes: 5 additions & 0 deletions tests/ts/_/schema/generated/SchemaRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ export const InputObjectNested = $.InputObject(`InputObjectNested`, {
InputObject: $.Input.field(() => $.Input.Nullable(InputObject)),
})

export const InputObjectNestedNonNull = $.InputObject(`InputObjectNestedNonNull`, {
InputObject: $.Input.field(() => InputObject),
})

export const InputObject = $.InputObject(`InputObject`, {
id: $.Input.field($.Input.Nullable($Scalar.ID)),
idRequired: $.Input.field($Scalar.ID),
Expand Down Expand Up @@ -124,6 +128,7 @@ export const Query = $.Object$(`Query`, {
dateArgNonNullListNonNull: $.field($.Output.Nullable($Scalar.Date), $.Args({ date: $.Input.List($Scalar.Date) })),
dateArgInputObject: $.field($.Output.Nullable($Scalar.Date), $.Args({ input: $.Input.Nullable(InputObject) })),
InputObjectNested: $.field($.Output.Nullable($Scalar.ID), $.Args({ input: $.Input.Nullable(InputObjectNested) })),
InputObjectNestedNonNull: $.field($.Output.Nullable($Scalar.ID), $.Args({ input: InputObjectNested })),
id: $.field($.Output.Nullable($Scalar.ID)),
idNonNull: $.field($Scalar.ID),
string: $.field($.Output.Nullable($Scalar.String)),
Expand Down
5 changes: 5 additions & 0 deletions tests/ts/_/schema/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type Query {
# Note: It is important that the type `InputObjectNested` is defined before `InputObject` in the generated runtime schema.
# This is to force the case of needing a thunk, to make sure our tests for it are actually testing the case.
InputObjectNested(input: InputObjectNested): ID
InputObjectNestedNonNull(input: InputObjectNested!): ID
# Scalar
id: ID
idNonNull: ID!
Expand Down Expand Up @@ -78,6 +79,10 @@ input InputObjectNested {
InputObject: InputObject
}

input InputObjectNestedNonNull {
InputObject: InputObject!
}

input InputObject {
id: ID
idRequired: ID!
Expand Down

0 comments on commit 310f10c

Please sign in to comment.