Schema-uitbreiding
Schema-uitbreidingSchema-uitbreidingen via introspectie

Schema-uitbreidingen via introspectie

Aangepaste metadata die aan schema-elementen is gekoppeld, kan worden opgevraagd via het veld extensions bij het uitvoeren van introspectie.

Alle introspectie-elementen van het schema implementeren dit veld — elk van hen retourneert een object van een overeenkomstig "Extensions"-type, dat de aangepaste eigenschappen van dat element blootstelt.

Het GraphQL-schema ziet er als volgt uit:

# 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!
}

Hoe te gebruiken

De volgende GraphQL-introspectiequery demonstreert de beschikbare eigenschappen in elk extensions-veld:

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
        }
      }
    }
  }
}

GraphQL-specificatie

Deze functionaliteit maakt momenteel geen deel uit van de GraphQL-specificatie, maar is aangevraagd in: