dotansimha/graphql-code-generator

avoidOptionals inputValue as false not producing optional fields

Open

#6,521 opened on 2021年8月20日

GitHub で見る
 (1 comment) (19 reactions) (0 assignees)TypeScript (10,341 stars) (1,295 forks)batch import
corehelp wantedkind/enhancement

説明

Describe the bug

In the following live demo:

  • observe an optional GQL query input, userId: ID
  • you can see that we are avoidOptionals: { inputValue: false } for that value
  • the output does avoid optionals, despite being instructed not to. you can see the following output:

image

export type FindUserQueryVariables = Exact<{
  userId: Maybe<Scalars['ID']>;
}>;

Interestingly, if you flip object: false as well, suddenly the correct behavior takes for inputValue: false. Perhaps these are unintentionally coupled?

https://www.graphql-code-generator.com/docs/plugins/typescript-operations

To Reproduce

Codesandbox has been down for me. The schema, query, & config are listed below. The repro is quite simple :)

  1. My GraphQL schema:

Stripped down version of the homepage demo:

schema {
  query: Query
}

type Query {
  user(id: ID): User
}

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
}
  1. My GraphQL operations:
query findUser($userId: ID) {
  user(id: $userId) {
    id
  }
}
  1. My codegen.yml config file:
generates:
  operations-types.ts:
    plugins:
      - typescript
      - typescript-operations
    config:
      avoidOptionals: 
        defaultValue: true
        field: true
        object: true # toggle me!
        inputValue: false
      

Expected behavior

To produce an optional value for the userId?: Maybe<Int> field:

expected:

export type FindUserQueryVariables = Exact<{
  userId?: Maybe<Scalars['ID']>;
}>;

actual:

export type FindUserQueryVariables = Exact<{
  userId: Maybe<Scalars['ID']>;
}>;

Environment:

latest, deployed on graphql-code-generator website

Additional context

This PR https://github.com/dotansimha/graphql-code-generator/pull/5113, in the bottom comment, seems to suggest that this design is intentional. However, object seems orthogonal to inputValue for avoidOptionals configuration, and produces an unexpected result. If they are not orthogonal, then inputValue should take precedence over object

コントリビューターガイド