Gerar tipos GraphQL TypeScript para MongoDB — Numio
Gera tipos TypeScript de documentos MongoDB a partir de um schema anotado com @entity, @id, @column, @link, @embedded e @map, usando @graphql-codegen/typescript-mongodb. Cada tipo com @entity recebe um tipo <Name>DbObject; campos sem diretiva ficam de fora.
Manter tipado o formato do documento armazenado no MongoDB junto aos tipos da API GraphQL da mesma entidade.
Quando usar
- Manter tipado o formato do documento armazenado no MongoDB junto aos tipos da API GraphQL da mesma entidade.
- Ver como caminhos de @map e referências de @link se traduzem em objetos aninhados e arrays de ObjectId antes de escrever o código de acesso a dados.
Como usar
- Cole um schema cujos tipos usem @entity e cujos campos usem @id, @column, @link, @embedded ou @map(path: ...).
- Confira os tipos DbObject perto do fim da saída; os próprios tipos GraphQL são gerados acima deles.
- Copie o resultado para um arquivo .ts; ele importa ObjectId do pacote mongodb.
Schema GraphQL com diretivas do 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
}Tipos DbObject em TypeScript
…
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
}Detalhes e limitações
@id vira _id: ObjectId, @link vira o _id da entidade vinculada (Array<PostDbObject["_id"]> para listas) e @map(path: "login.email") cria um objeto login aninhado.
Campos sem diretiva (sem @column, @id, @link ou @embedded) não entram no tipo DbObject; colunas nullable viram propriedades Maybe<T> opcionais.
A saída também contém os tipos padrão do plugin typescript (omitidos acima). A geração roda em um Web Worker no seu navegador.
FAQ
Preciso declarar as diretivas @entity e @column no meu schema?
Não. O plugin adiciona suas próprias definições de diretivas, e é por isso também que um tipo input AdditionalEntityFields aparece na saída.
Como documentos embutidos são tipados?
Um tipo declarado com @entity(embedded: true) recebe um tipo DbObject sem _id, e um campo marcado com @embedded o referencia, por exemplo profile: ProfileDbObject.
Por que um campo está faltando no tipo DbObject?
Só campos com @id, @column, @link, @embedded ou @map são campos armazenados. Adicione @column para incluir um campo simples.