eddeee888 / graphql-code-generator-plugins

List of GraphQL Code Generator plugins that complements the official plugins.
MIT License
44 stars 10 forks source link

[FEAT]Mapping Inputs and Mutation/Query Arguments #274

Closed benborcherding closed 1 month ago

benborcherding commented 1 month ago

Is your feature request related to a problem? Please describe. As I'm relatively new to the GraphQL ecosystem, I apologize if this request duplicates existing functionality or is outdated. My objective is to map defined inputs from a .graphql schema to TS types, and similarly, I aim to map Mutation/Query arguments to TS types as well.

Describe the solution you'd like I am seeking a solution for mapping between GraphQL inputs and Mutation/Query arguments with corresponding TS types.

Additional context Here is a small example:

schema.graphql:

type User {
    id: ID!,
    firstName: String!,
    lastName: String!,
    salutation: String!,
    email: Email!
}

input CreateUserInput {
    firstName: String!,
    lastName: String!,
    salutation: String!
}

input UpdateUserInput {
    firstName: String,
    lastName: String,
    salutation: String,
    email: Email
}

type Email {
    id: ID!,
    email: String!,
    verifiedAt: String
}

input EmailInput {
    email: String!,
    verifiedAt: String
}

extend type Query {
    user(id: ID!): User
    email(id: ID!): Email
}

extend type Mutation {
    createUser(user: CreateUserInput!): User
    createEmail(email: EmailInput!): Email
    updateUser(id: ID!, email: UpdateUserInput!): User
    updateEmail(id: ID!, email: EmailInput): Email
    deleteUser(id: ID!): User
    deleteEmail(id: ID!): Email
}

schema.mappers.ts:

export type EmailMapper =  {
    id: string,
    email: string,
    verifiedAt?: string,
}

export type EmailInputMapper = Omit<EmailMapper, 'id'>

export type UserMapper = {
    id: string,
    firstName: string,
    lastName: string,
    salutation: string,
    emailId: string,
}

export type CreateUserInputMapper = Omit<UserMapper, 'id' | 'emailId'>

export type UpdateUserInputMapper = CreateUserInputMapper & {email: EmailMapper}

codegen.ts:

import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';
import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: '**/schema.graphql',
  generates: {
    'src/graphql/schema': defineConfig({
      typesPluginsConfig: {
        contextType: "../../index#Context"
      },
    })
  }
}
export default config; 

The generated Arguments and Inputs look like:

...
export type MutationcreateEmailArgs = {
  email: EmailInput;
};
...
export type ResolversTypes = {
  CreateUserInput: CreateUserInput;
  EmailInput: EmailInput;
...
}