Ampliación del esquema
Ampliación del esquemaExtensiones del esquema vía introspección

Extensiones del esquema vía introspección

Los metadatos personalizados adjuntos a los elementos del esquema pueden consultarse mediante el campo extensions al hacer introspección.

Todos los elementos de introspección del esquema implementan este campo, devolviendo cada uno un objeto del correspondiente tipo "Extensions", que expone las propiedades personalizadas de ese elemento.

El esquema GraphQL tiene este aspecto:

# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
  # Is the schema being namespaced?
  isNamespaced: Boolean!
}
 
extend type __Schema {
  extensions: _SchemaExtensions!
}
 
type _NamedTypeExtensions {
  # The type name
  elementName: String!
 
  # The "namespaced" type name
  namespacedName: String!
 
  # Enum-like "possible values" for EnumString type resolvers, `null` otherwise
  possibleValues: [String!]
 
  # OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
  isOneOf: Boolean!
}
 
extend type __Type {
  # Non-null for named types, null for wrapping types (Non-Null and List)
  extensions: _NamedTypeExtensions
}
 
type _DirectiveExtensions {
  # If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
  needsDataToExecute: Boolean!
 
  # Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
  fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
 
extend type __Directive {
  extensions: _DirectiveExtensions!
}
 
type _FieldExtensions {
  # Useful for nested mutations
  isMutation: Boolean!
 
  # `true` => Only exposed when "Expose “sensitive” data elements" is enabled
  isSensitiveDataElement: Boolean!
}
 
extend type __Field {
  extensions: _FieldExtensions!
}
 
type _InputValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __InputValue {
  extensions: _InputValueExtensions!
}
 
type _EnumValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __EnumValue {
  extensions: _EnumValueExtensions!
}

Cómo usar

La siguiente consulta de introspección GraphQL demuestra las propiedades disponibles en cada campo extensions:

query ExtensionsIntrospectionQuery {
  __schema {
    extensions {
      isNamespaced
    }
    types {
      name
      extensions {
        elementName
        namespacedName
        possibleValues
        isOneOf
      }
      fields {
        name
        extensions {
          isMutation
          isSensitiveDataElement
        }
        args {
          name
          extensions {
            isSensitiveDataElement
          }
        }
      }
      inputFields {
        name
        extensions {
          isSensitiveDataElement
        }
      }
      enumValues {
        name
        extensions {
          isSensitiveDataElement
        }
      }
    }
    directives {
      name
      extensions {
        needsDataToExecute
        fieldDirectiveSupportedTypeNamesOrDescriptions
      }
      args {
        name
        extensions {
          isSensitiveDataElement
        }
      }
    }
  }
}

Especificación de GraphQL

Esta funcionalidad actualmente no forma parte de la especificación de GraphQL, pero se ha solicitado en: