dotansimha / dotansimha/graphql-code-generator-community
[typescript-generic-sdk] Generates incorrect types when rawRequest is true
- Dominant language
- TypeScript
- Stars
- 137
- Forks
- 195
- Avg merge
- 6h 20m
- Merged PRs (30d)
- 16
Description
**Describe the bug**
**To Reproduce**
https://codesandbox.io/s/quirky-dew-7d9bp?file=/types.ts
Steps to reproduce the behavior:
1. My GraphQL schema:
```graphql
type Query {
user(id: ID!): User!
}
type User {
id: ID!
username: String!
email: String!
}
```
2. My GraphQL operations:
```graphql
query user {
user(id: 1) {
id
username
email
}
}
```
3. My `codegen.yml` config file:
```yml
schema: schema.graphql
documents: document.graphql
config:
rawRequest: true
skipTypename: true
generates:
types.ts:
plugins:
- "@graphql-codegen/typescript"
- "@graphql-codegen/typescript-operations"
- "@graphql-codegen/typescript-generic-sdk"
```
**Expected behavior**
It generates the following code.
```ts
export function getSdk(requester: Requester) {
return {
user(variables?: UserQueryVariables, options?: C): Promise<{ data?: UserQuery, errors?: Array<{ message: string; extensions?: unknown }>, extensions?: unknown }> {
return requester(UserDocument, variables, options);
}
};
}
```
However, it should generate the following code instead.
```ts
export function getSdk(requester: Requester) {
return {
user(variables?: UserQueryVariables, options?: C): Promise<{ data?: UserQuery, errors?: Array<{ message: string; extensions?: unknown }>, extensions?: unknown }> {
return requester<{ data?: UserQuery, errors?: Array<{ message: string; extensions?: unknown }>, extensions?: unknown }, UserQueryVariables>(UserDocument, variables, options);
}
};
}
```
Because the generic parameter of `requester` is the return value. It should match the function return value.
**Environment:**
- OS: Windows 10
- `@graphql-codegen/cli`: 2.3.0
- `@graphql-codegen/typescript`: 2.4.1
- `@graphql-codegen/typescript-generic-sdk`: 2.3.0
- `@graphql-codegen/typescript-operations`: 2.2.1
- NodeJS: v14.17.0
**Additional context**
My suggestion is to create a generic type for the response to prevent not match response type.
```ts
// rawRequest: false
export type Response = T;
// rawRequest: true
export type Response = { data?: T, errors?: Array<{ message: string; extensions?: unknown }>, extensions?: unknown };
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.