Pular para o conteúdo

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.

GraphQL Schema

TypeScript MongoDB

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

  1. Cole um schema cujos tipos usem @entity e cujos campos usem @id, @column, @link, @embedded ou @map(path: ...).
  2. Confira os tipos DbObject perto do fim da saída; os próprios tipos GraphQL são gerados acima deles.
  3. 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.

Especificações e referências