graphql-schema

Guia de melhores práticas da indústria para projetar schemas GraphQL intuitivos, performáticos e de fácil manutenção. Aborda princípios fundamentais de design, incluindo organização de tipos centrada no cliente, padrões explícitos de nulidade e estratégias de evolução com compatibilidade reversa. Fornece documentação de referência sobre tipos, convenções de nomenclatura, paginação baseada em cursor, modelagem de erros e considerações de segurança. Inclui padrões práticos para interfaces, uniões, tipos de entrada, mutações e estratégias de ID com exemplos de código...

npx skills add https://github.com/apollographql/skills --skill graphql-schema

GraphQL Schema Design Guide

This guide covers best practices for designing GraphQL schemas that are intuitive, performant, and maintainable. Schema design is primarily a server-side concern that directly impacts API usability.

Schema Design Principles

1. Design for Client Needs

  • Think about what queries clients will write
  • Organize types around use cases, not database tables
  • Expose capabilities, not implementation details

2. Be Explicit

  • Use clear, descriptive names
  • Make nullability intentional
  • Document with descriptions

3. Design for Evolution

  • Plan for backwards compatibility
  • Use deprecation before removal
  • Avoid breaking changes
  • Give every new argument or input field a default value, or make it nullable. Existing clients don't send it, so a required field without a default makes their requests fail validation.

Quick Reference

Type Definition Syntax

"""
A user in the system.
"""
type User {
  id: ID!
  email: String!
  name: String
  posts(first: Int = 10, after: String): PostConnection!
  createdAt: DateTime!
}

Nullability Rules

PatternMeaning
StringNullable - may be null
String!Non-null - always has value
[String]Nullable list, nullable items
[String!]Nullable list, non-null items
[String]!Non-null list, nullable items
[String!]!Non-null list, non-null items

Best Practice: Use [Type!]! for lists - empty list over null, no null items.

Input vs Output Types

# Output type - what clients receive
type User {
  id: ID!
  email: String!
  createdAt: DateTime!
}

# Input type - what clients send
input CreateUserInput {
  email: String!
  name: String
}

# Mutation using input type
type Mutation {
  createUser(input: CreateUserInput!): User!
}

Interface Pattern

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
  email: String!
}

type Post implements Node {
  id: ID!
  title: String!
}

Union Pattern

union SearchResult = User | Post | Comment

type Query {
  search(query: String!): [SearchResult!]!
}

Reference Files

Detailed documentation for specific topics:

  • Types - Type design patterns, interfaces, unions, and custom scalars
  • Naming - Naming conventions for types, fields, and arguments
  • Pagination - Connection pattern and cursor-based pagination
  • Errors - Error modeling and result types
  • Security - Security best practices for schema design

Key Rules

Type Design

  • Define types based on domain concepts, not data storage
  • Use interfaces for shared fields across types
  • Use unions for mutually exclusive types
  • Keep types focused (single responsibility)
  • Avoid deep nesting - flatten when possible

Field Design

  • Fields should be named from client's perspective
  • Return the most specific type possible
  • Make expensive fields explicit (consider arguments)
  • Use arguments for filtering, sorting, pagination

Mutation Design

  • Use single input argument pattern: mutation(input: InputType!)
  • Return affected objects in mutation responses
  • Model mutations around business operations, not CRUD
  • Consider returning a union of success/error types

ID Strategy

  • Use globally unique IDs when possible
  • Implement Node interface for refetchability
  • Base64-encode compound IDs if needed

Ground Rules

  • ALWAYS add descriptions to types and fields
  • ALWAYS use non-null (!) for fields that cannot be null
  • ALWAYS use [Type!]! pattern for lists
  • ALWAYS paginate lists that can grow without limit, such as Query.users or Post.comments: return a connection and give first a default page size
  • NEVER expose database internals in schema
  • NEVER break backwards compatibility without deprecation
  • NEVER add a required argument or input field without a default value
  • PREFER dedicated input types over many arguments
  • PREFER enums over arbitrary strings for fixed values
  • USE ID type for identifiers, not String or Int
  • USE custom scalars for domain-specific values (DateTime, Email, URL)

Mais skills de apollographql

apollo-federation
apollographql
O Apollo Federation permite compor múltiplas APIs GraphQL (subgrafos) em um supergrafo unificado.
apollo-ios
apollographql
Apollo iOS é um cliente GraphQL fortemente tipado para plataformas Apple. Ele gera tipos Swift a partir das suas operações e schema GraphQL, e inclui um cliente async/await, um cache normalizado (em memória ou com suporte a SQLite), um transporte HTTP baseado em interceptadores plugáveis que lida com queries, mutations e assinaturas multipart, e um transporte WebSocket opcional (graphql-transport-ws) que pode transportar qualquer tipo de operação.
apollo-router
apollographql
O Apollo Router é um roteador de grafos de alto desempenho escrito em Rust para executar supergrafos do Apollo Federation 2. Ele fica na frente dos seus subgrafos e lida com planejamento de consultas, execução e composição de respostas.
apollo-router-plugin-creator
apollographql
Crie plugins nativos em Rust para o Apollo Router.
apollo-server
apollographql
Guia completo para construir servidores GraphQL com Apollo Server 5.x em diferentes frameworks. Aborda definição de esquemas, resolvers, configuração de contexto e tratamento de erros com suporte a TypeScript. Suporta modo standalone para prototipagem e integrações com Express, Fastify, Koa e ambientes serverless. Inclui padrões de resolvers, autenticação/autorização, plugins, DataLoader para prevenção de N+1 e técnicas de otimização de desempenho. Fornece documentação de referência para fontes de dados, erros...
graphql-operations
apollographql
Guia de melhores práticas para escrever operações GraphQL eficientes e type-safe, organizando-as com fragments. Aborda queries, mutations, subscriptions e fragments com convenções de nomenclatura, sintaxe de variáveis e uso de diretivas. Enfatiza princípios fundamentais: solicitar apenas os campos necessários, nomear todas as operações, usar variáveis em vez de valores fixos e incluir campos de id para capacidade de cache. Recomenda colocar fragments junto com componentes e usar as diretivas @include / @skip para campos condicionais...
rover
apollographql
CLI Apollo Rover para gerenciar esquemas GraphQL, federação e desenvolvimento local de supergraph. Publique, busque e valide esquemas de subgraph; componha supergraphs federados localmente ou via GraphOS. Inclui verificação de esquema (validação pré-implantação), linting e introspecção de servidores em execução. O comando rover dev inicia um Router local com composição automática de esquema para fluxos de desenvolvimento. Suporta padrões de CI/CD com validação check-before-publish e saída JSON para scripts. Requer...
rust-best-practices
apollographql
Padrões de codificação idiomáticos em Rust baseados no manual de melhores práticas da Apollo GraphQL. Abrange nove áreas principais: estilos e expressões idiomáticas de codificação, linting com clippy, otimização de desempenho, tratamento de erros, padrões de teste, genéricos e dispatch, padrão de estado de tipo, documentação e segurança de ponteiros. Enfatiza borrowing em vez de clonagem, tratamento de erros baseado em Result com thiserror/anyhow e perfilamento de desempenho com builds de release. Inclui orientação de referência rápida sobre padrões de ownership, prevenção de pânicos,...