Configurar o schema
Configurar o schemaUsando diretivas compostas

Usando diretivas compostas

Faça uma diretiva modificar o comportamento de outra diretiva.

Essa funcionalidade permite usar uma diretiva quando, de outra forma, não seria possível utilizá-la devido a uma incompatibilidade de tipo (ou seja, quando uma diretiva não pode ser aplicada ao campo porque possui uma entrada diferente da saída do campo).

Por exemplo, o campo capabilities retorna [String] (um array de strings), e a diretiva @strUpperCase recebe String. Portanto, a execução da seguinte query retorna um erro devido à incompatibilidade de tipo:

query {
  user(by: {id: 1}) {
    capabilities @strUpperCase
  }
}

Com as diretivas compostas, podemos empregar a diretiva @underEachArrayItem (que itera sobre um array de elementos e aplica sua diretiva aninhada a cada um deles) para preparar o terreno antes que @strUpperCase seja executada, fazendo-a receber um único elemento (do tipo String).

A query acima pode ser satisfeita da seguinte forma:

query {
  user(by: {id: 1}) {
    capabilities
      @underEachArrayItem
        @strUpperCase
  }
}

Meta-diretivas

Cada meta-diretiva pode afetar (ou "aninhar") múltiplas diretivas ao mesmo tempo. As diretivas afetadas são indicadas pelo argumento affectDirectivesUnderPos, que recebe um array de inteiros positivos, cada um definindo a posição relativa da diretiva afetada.

Por padrão, o argumento affectDirectivesUnderPos tem o valor padrão [1], o que significa que afetará a diretiva imediatamente ao lado.

No exemplo abaixo, temos:

  • @underEachArrayItem é a meta-diretiva
  • @strTranslate está aninhada sob @underEachArrayItem (valor padrão implícito affectDirectivesUnderPos: [1])
{
  someField
    @underEachArrayItem
      @strTranslate
}

No exemplo abaixo, temos em vez disso:

  • @strTranslate e @strUpperCase estão aninhadas sob @underEachArrayItem (conforme indicado pelas posições relativas [1, 2] no argumento affectDirectivesUnderPos)
{
  someField
    @underEachArrayItem(affectDirectivesUnderPos: [1, 2])
      @strTranslate
      @strUpperCase
}

Meta-diretivas também podem ser aninhadas dentro de outras meta-diretivas.

No exemplo abaixo, temos:

  • @underEachArrayItem é a meta-diretiva mais externa
  • @underJSONObjectProperty está aninhada sob @underEachArrayItem
  • @strUpperCase está aninhada sob @underJSONObjectProperty
query UppercaseEntriesInsideObject {
  entries: _echo(value: [
    {
      text: "Hello my friends"
    },
    {
      text: "How do you like this software so far?"
    }
  ])
   @underEachArrayItem
      @underJSONObjectProperty(by: { key: "text" })
        @strUpperCase
  }

Configuração

Para habilitar ou desabilitar as diretivas compostas no schema GraphQL, acesse o módulo "Composable Directives" na página de Configurações e marque/desmarque a caixa de seleção Enable composable directives?:

Configurações para Composable Directives
Configurações para Composable Directives

Para habilitar ou desabilitar as diretivas compostas em um endpoint específico, selecione a opção desejada no bloco "Composable Directives" da Schema Configuration correspondente:

Composable Directives na Schema Configuration
Composable Directives na Schema Configuration