Расширение схемыРасширения схемы через интроспекцию
Расширения схемы через интроспекцию
Пользовательские метаданные, прикреплённые к элементам схемы, можно запрашивать через поле extensions при выполнении интроспекции.
Все элементы интроспекции схемы реализуют это поле, каждый из которых возвращает объект соответствующего типа «Extensions», который предоставляет пользовательские свойства для этого элемента.
Схема GraphQL выглядит следующим образом:
# 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!
}Как использовать
Следующий запрос интроспекции GraphQL демонстрирует свойства, доступные в каждом поле 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
}
}
}
}
}Спецификация GraphQL
В настоящее время эта функциональность не входит в спецификацию GraphQL, однако соответствующий запрос был создан в: