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
Inputsuffix:CreateUserInput,UpdateOrderInput - Mutation return types take a
Payloadsuffix: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
}