

rootValue специфичен для реализации javascript и, насколько мне известно, не является чем-то, что явно требуется официальной спецификацией.
Это определение типа для функции resolve (или преобразователя), представленное в документы:
type GraphQLFieldResolveFn = (
source?: any,
args?: {[argName: string]: any},
context?: any,
info?: GraphQLResolveInfo
) => any
Первым параметром, передаваемым распознавателю, является значение «источник», «корень» или «родитель». Поле всегда связано с некоторым типом объекта. «Исходное» значение — это просто значение, в которое разрешено поле, возвращающее этот тип объекта. Например, при таком запросе:
{
user(id: 1) {
location {
city
}
}
}
Поле user возвращает тип объекта. Когда он разрешается, разрешенное значение передается преобразователю location в качестве «источника». Точно так же, когда location разрешается, разрешенное значение передается распознавателям для всех запрошенных полей, таких как city.
В нашем примере user является полем, как и любой другой, просто он относится к типу Query, но сам этот тип по-прежнему является типом объекта. Поскольку это поле, оно разрешается путем вызова связанного с ним распознавателя. Но поскольку он находится в корень запроса, «исходного» значения нет. Это единственная цель rootValue, которую вы передаете execute — он передается каждому преобразователю корневого уровня в качестве «исходного» значения.
Другими словами, все, что вы установите для rootValue, будет передано в качестве первого параметра преобразователю для каждого поля типов Query, Mutation и Subscription.
Поскольку rootValue доступен только для распознавателей корневого уровня, его использование очень ограничено. Любые данные, которые должны быть доступны для преобразователей все, вместо этого должны быть включены в контекст.
Для полноты картины я должен отметить, что существуют примеры, показывающие, как создать схему с помощью SDL и buildSchema. Поскольку buildSchema не предлагает способа предоставления распознавателей для каких-либо полей, эти примеры предоставляют способ разрешения полей корневого уровня путем передачи функций распознавателя через rootValue. Это работает, потому что, как отмечают документы:
[If] a resolver function is not provided, then the default resolver is used, which looks for a method on source of the same name as the field. If found, the method is called with (args, context, info).
Однако, опять же, rootValue доступен только для полей корневых типов (запрос, мутация и подписка). Если вы создадите схему таким образом, вы не сможете определить преобразователи для полей любых других типов. Другими словами, не делайте этого. Подробнее см. этот ответ.