В файле схемы, который я заметил, есть восклицательные знаки после некоторых типов, например
# Information on an account relationship
type AccountEdge {
cursor: String!
node: Account!
}
Что это значит? Я ничего не могу найти об этом ни в документации, ни в гугле ?


Это означает, что поле не допускает значения NULL.
См. Дополнительную информацию в Graphql - схемы и типы
Ссылка на документацию с изящной подсветкой (работает в Chrome): graphql.org/learn/schema/….
@Purplejacket Замечательно, я обновил ссылку в ответе! :)
Из спецификация:
By default, all types in GraphQL are nullable; the null value is a valid response for all of the above types. To declare a type that disallows null, the GraphQL Non‐Null type can be used. This type wraps an underlying type, and this type acts identically to that wrapped type, with the exception that null is not a valid response for the wrapping type. A trailing exclamation mark is used to denote a field that uses a Non‐Null type like this: name: String!.
Другими словами, типы в GraphQL по умолчанию допускают значение NULL. Восклицательный знак после типа специально обозначает этот тип как не допускающий значения NULL.
Это имеет разные последствия в зависимости от того, где используется тип.
Когда к типу поле применяется ненулевое значение, это означает, что если сервер разрешает это поле в null, ответ не пройдет проверку. Вы все равно можете получить частичный ответ, если ошибка не размножаются до корня.
Например, учитывая такую схему:
type Query {
user: User
}
type User {
id: ID!
}
Здесь поле id не равно нулю. Помечая поле как ненулевое, мы фактически гарантия, мы никогда не вернем null для этого поля. Если сервер действительно возвращает значение null, это означает, что что-то пошло не так, и мы хотим выдать ошибку проверки.
Когда к типу Вход применяется ненулевое значение, такое как аргумент, поле входного объекта или переменная, он делает этот ввод обязательным. Например:
type Query {
getUser(id: ID!, status: Status): User
}
Здесь аргумент id не равен нулю. Если мы запрашиваем поле getUser, нам всегда нужно будет предоставить для него аргумент id. С другой стороны, поскольку аргумент status допускает значение NULL, он необязателен и может быть опущен. Это относится и к переменным:
query MyQuery ($foo: ID!) {
getUser(id: $foo)
}
Поскольку переменная $foo не имеет значения NULL, при отправке запроса ее нельзя пропустить, и ее значение не может равняться null.
Поскольку в нашем примере поле id является ненулевым типом ID (то есть ID!), любая передаваемая ему переменная должна быть также ненулевым ID. Если бы наша переменная $foo была обнуляемой ID, мы не смогли бы передать ее аргументу id. Однако обратное неверно. Если аргумент допускает значение NULL, вы может передаете ему ненулевую переменную.
Другими словами:
+----------+----------+--------+
| Argument | Variable | Valid? |
+----------+----------+--------+
| String | String | ✅ |
| String | String! | ✅ |
| String! | String | ❌ |
| String! | String! | ✅ |
+----------+----------+--------+
Это заняло больше времени, чем я ожидал. Даже шпаргалки по GraphQL и документы Prisma и Apollo явно не упоминали об этом.