Как настроить тип создаваемого поля graphql-code-generator при использовании схемы graphql Hasura
Я хотел бы переопределить тип jsonb для конкретного поля в схеме graphql, созданной Hasura, и запустить через генератор кода graphql.
у меня есть customList
поле типа jsonb. Ths используется для хранения массива объектов json. При использовании graphql-code-generator с плагином TypeScript сгенерированный тип преобразуется вany
. Я пытаюсь выяснить, как переопределить это с помощью настраиваемого типа только для этого конкретного поля.
В приведенных ниже фрагментах показан соответствующий раздел схемы graphql и переопределения целевого типа graphql. Пока что все, что я пробовал, приводит к ошибкам кодогенерации
Схема GraphQl
//schema.json
...
{
"kind": "OBJECT",
"name": “MyEntity”,
"description": "columns and relationships of MyEntity",
"fields": [
...
{
"name": "customList",
"description": "",
"args": [
{
"name": "path",
"description": "JSON select path",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "SCALAR",
"name": "jsonb",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
}
}
Целевые типы переопределения
//clientTypes.graphql
type ListItem {
itemId: string!
}
extend type MyEntity {
ccards: [ListItem!]
}
Спасибо за любую помощь!
3 ответа
Существует
scalars
config для плагина Typescript, где вы можете определить собственный тип для любого скаляра.
Сначала вам нужно определить настраиваемую схему на стороне клиента. Расширить
MyEntity
type, чтобы иметь специальный скаляр вместо Jsonb
client-schema.graphql
scalar CardList
extend type MyEntity {
ccards: CardList!
}
Затем создайте файл, который будет содержать тип для этого скаляра:
scalars.ts
type ListItem {
itemId: string!
}
export type CardList = ListItem[]
Затем добавьте новую схему и настраиваемый тип в
.yml
config кодогенератора graphql следующим образом:
schema:
- https://your-remote-schema.url/v1/graphql:
documents: "src/**/*.ts"
generates:
src/graphql/schema.ts:
schema: src/graphql/client-schema.graphql
plugins:
- typescript
- typescript-operations
config:
scalars:
CardList: ./scalars#CardList
Примечание: путь должен быть относительно сгенерированного файла
https://github.com/dotansimha/graphql-code-generator/issues/153#issuecomment-776735610
Вы можете указать кодогенератору новый файл - скажем, my-schema.js
, а затем манипулируйте схемой по своему желанию. Вы можете использовать для этого любой инструмент, который вам нравится (graphql-toolkit / graphql-compose / прямое управление GraphQLSchema)