スキーマ拡張イントロスペクションによるスキーマ拡張
イントロスペクションによるスキーマ拡張
スキーマ要素に付加されたカスタムメタデータは、イントロスペクション実行時に 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 仕様には含まれていませんが、以下で要望が上がっています: