Skip to main content

GraphQL

Types

Use PascalCase for all named types. Be specific — User is better than Person, UserProfile is better than UserData.

type User {
id: ID!
firstName: String!
lastName: String!
emailAddress: String!
createdAt: DateTime!
}

Fields

Use camelCase for all field names:

type Order {
id: ID!
placedAt: DateTime!
totalAmount: Float!
lineItems: [LineItem!]!
}

Queries and Mutations

Query names use camelCase verbs or noun phrases. Mutation names follow a verbNoun pattern:

type Query {
user(id: ID!): User
users(filter: UserFilter, pagination: Pagination): UserConnection
}

type Mutation {
createUser(input: CreateUserInput!): CreateUserPayload!
updateUser(id: ID!, input: UpdateUserInput!): UpdateUserPayload!
deleteUser(id: ID!): DeleteUserPayload!
}

Input and Payload Types

  • Input types take an Input suffix: CreateUserInput, UpdateOrderInput
  • Mutation return types take a Payload suffix: CreateUserPayload, DeleteOrderPayload

This makes their purpose unambiguous when they appear in generated clients or schema docs.

Enums

Enum type names are PascalCase; enum values are SCREAMING_SNAKE_CASE:

enum OrderStatus {
PENDING
IN_PROGRESS
FULFILLED
CANCELLED
}

Avoid

# Avoid — abbreviations, inconsistent field names, generic types
type Person {
uid: String
fname: String
surname: String
email: String
created: String
}