Генератор GraphQL TypeScript для MongoDB — Numio
Генерирует TypeScript-типы документов MongoDB из схемы с аннотациями @entity, @id, @column, @link, @embedded и @map с помощью @graphql-codegen/typescript-mongodb. Каждый тип с @entity получает тип <Name>DbObject; поля без директивы опускаются.
Держать структуру хранимых документов MongoDB типизированной рядом с типами GraphQL API той же сущности.
Когда пригодится
- Держать структуру хранимых документов MongoDB типизированной рядом с типами GraphQL API той же сущности.
- Увидеть, как пути @map и ссылки @link превращаются во вложенные объекты и массивы ObjectId, прежде чем писать код доступа к данным.
Как пользоваться
- Вставьте схему, типы которой используют @entity, а поля — @id, @column, @link, @embedded или @map(path: ...).
- Найдите типы DbObject ближе к концу вывода; сами типы GraphQL генерируются выше них.
- Скопируйте результат в .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, чтобы включить обычное поле.