Как настроить тип создаваемого поля 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

Чтобы устранить проблему «невозможно объединить тип», возникающую в результате использования рабочего процесса @Georges, добавьте эту строку в codegen.yml:

      config:
  ignoreFieldConflicts: true

Для получения полной справки ознакомьтесь с этой проблемой github.

Дополнительная ссылка

Вы можете указать кодогенератору новый файл - скажем, my-schema.js, а затем манипулируйте схемой по своему желанию. Вы можете использовать для этого любой инструмент, который вам нравится (graphql-toolkit / graphql-compose / прямое управление GraphQLSchema)

Другие вопросы по тегам