Grafbase Spec
This document defines the directives and types that have special treatment in the Grafbase gateway. They are meant to be used as building blocks for extension directives. The gateway will automatically detect them and inject the right data in their stead.
Here after is the full definition:
"""
String specifying a selection set over the arguments which should be provided at runtime.
"""
scalar InputValueSet
"""
String specifying a selection set over the response data which should be provided at runtime.
"""
scalar FieldSet
Import me with:
extend schema
@link(url: "https://specs.grafbase.com/grafbase", import: ["FieldSet"])
"""
String specifying a selection set over the arguments which should be provided at runtime.
"""
scalar InputValueSet
The InputValueSet
scalar is used to inject arguments into a directive. It's a String
that defines a selection set such as "ids filter { age }"
on the field arguments with a special case "*"
that will inject all the arguments as shown in the following example:
# Extension SDL
directive @myDirective(input: InputValueSet) on FIELD_DEFINITION
# ---
# Subgraph SDL
type Query {
# Receives all arguments
users(ids: [ID!], filter: Filter): [User!] @myDirective(input: "*")
# Which is equivalent to the following
users(ids: [ID!], filter: Filter): [User!] @myDirective(input: "ids filter")
# Fine-grained selection
users(ids: [ID!], filter: Filter): [User!]
@myDirective(input: "filter { age }")
}
input Filter {
name: String
age: Int
}
type User {
id: ID!
}
Contrary to field selection sets used in operations, there is a relaxed rule for leaves: one can select "filter"
without specifying any sub-selection despite being an input object. The whole Filter
input object will be provided in that case.
InputValueSet
can be used in any extension directive definitions, but outside of FIELD_DEFINITION
location, any non-null InputValueSet
value will raise an error:
# Valid
type User @myDirective {
id: ID!
}
# Valid
type User @myDirective(input: null) {
id: ID!
}
# Invalid, will raise an error.
type User @myDirective(input: "*") {
id: ID!
}
"""
String specifying a selection set over the response data which should be provided at runtime.
"""
scalar FieldSet
The FieldSet
scalar is used to inject response data into a directive. It's a String
that defines a field selection set such as "id name"
on the current object or interface:
# Extension SDL
directive @myDirective(fields: FieldSet) on FIELD_DEFINITION
# ---
# Subgraph SDL
type User {
id: ID!
name: String
pets(limit: Int!): [Pet!]
catLoverFriends: [User!]
@myDirective(fields: "id pets(limit: 10) { ... on Cat { id } }")
}
union Pet = Cat | Dog
type Dog {
id: ID!
}
type Cat {
id: ID!
}
Except named fragments, FieldSet
accepts any valid field selection set with field arguments or inline fragments. The gateway will do its best to re-use existing operation fields if they match, but will request anything additional.
FieldSet
can be used in any extension directive definitions, but outside of FIELD_DEFINITION
, OBJECT
and INTERFACE
locations, any non-null FieldSet
value will raise an error:
# Valid
union Pet = Cat | Pet @myDirective
# Valid
union Pet = Cat | Pet @myDirective(fields: null)
# Invalid, will raise an error.
union Pet = Cat | Pet @myDirective(fields: "... on Cat { id }")