Перейти к содержимому

Генератор GraphQL TypeScript для MongoDB — Numio

Генерирует TypeScript-типы документов MongoDB из схемы с аннотациями @entity, @id, @column, @link, @embedded и @map с помощью @graphql-codegen/typescript-mongodb. Каждый тип с @entity получает тип <Name>DbObject; поля без директивы опускаются.

Держать структуру хранимых документов MongoDB типизированной рядом с типами GraphQL API той же сущности.

GraphQL Schema

TypeScript MongoDB

Когда пригодится

  • Держать структуру хранимых документов MongoDB типизированной рядом с типами GraphQL API той же сущности.
  • Увидеть, как пути @map и ссылки @link превращаются во вложенные объекты и массивы ObjectId, прежде чем писать код доступа к данным.

Как пользоваться

  1. Вставьте схему, типы которой используют @entity, а поля — @id, @column, @link, @embedded или @map(path: ...).
  2. Найдите типы DbObject ближе к концу вывода; сами типы GraphQL генерируются выше них.
  3. Скопируйте результат в .ts-файл; он импортирует ObjectId из пакета mongodb.

GraphQL-схема с директивами MongoDB

type User @entity {
  id: ID! @id
  email: String! @column @map(path: "login.email")
  profile: Profile! @embedded
  posts: [Post!]! @link
}

type Profile @entity(embedded: true) {
  name: String! @column
}

type Post @entity {
  id: ID! @id
  title: String! @column
}

TypeScript-типы DbObject

…
export type AdditionalEntityFields = {
  path?: InputMaybe<Scalars["String"]["input"]>
  type?: InputMaybe<Scalars["String"]["input"]>
}

import { ObjectId } from "mongodb"
export type UserDbObject = {
  _id: ObjectId
  login: {
    email: string
  }
  profile: ProfileDbObject
  posts: Array<PostDbObject["_id"]>
}

export type ProfileDbObject = {
  name: string
}

export type PostDbObject = {
  _id: ObjectId
  title: string
}

Подробности и ограничения

@id становится _id: ObjectId, @link — _id связанной сущности (Array<PostDbObject["_id"]> для списков), а @map(path: "login.email") создаёт вложенный объект login.

Поля без директивы (без @column, @id, @link, @embedded) не попадают в тип DbObject; nullable-столбцы становятся необязательными свойствами Maybe<T>.

Вывод также содержит стандартные типы плагина typescript (выше опущены). Генерация выполняется в Web Worker в браузере.

FAQ

Нужно ли объявлять директивы @entity и @column в схеме?

Нет. Плагин добавляет собственные определения директив, поэтому в выводе также появляется input-тип AdditionalEntityFields.

Как типизируются встроенные документы?

Тип, объявленный с @entity(embedded: true), получает тип DbObject без _id, а поле с пометкой @embedded ссылается на него, например profile: ProfileDbObject.

Почему поле отсутствует в типе DbObject?

Хранимыми считаются только поля с @id, @column, @link, @embedded или @map. Добавьте @column, чтобы включить обычное поле.

Спецификации и справка