Vai al contenuto

TypeScript GraphQL per MongoDB — Numio

Genera tipi di documenti TypeScript MongoDB da uno schema annotato con @entity, @id, @column, @link, @embedded e @map, utilizzando @graphql-codegen/typescript-mongodb. Ogni tipo di entità @ ottiene un tipo <Name>DbObject; i campi senza direttiva vengono omessi.

Mantenere la forma del documento MongoDB memorizzata digitata insieme ai tipi GraphQL API della stessa entità.

GraphQL Schema

TypeScript MongoDB

Quando usarlo

  • Mantenere la forma del documento MongoDB memorizzata digitata insieme ai tipi GraphQL API della stessa entità.
  • Osservare come i percorsi @map e i riferimenti @link si traducono in oggetti nidificati e array ObjectId prima di scrivere il codice di accesso ai dati.

Come si usa

  1. Incolla uno schema i cui tipi utilizzano @entity e i cui campi utilizzano @id, @column, @link, @embedded o @map(path: ...).
  2. Leggi i tipi DbObject verso la fine dell'output; i tipi GraphQL stessi vengono generati sopra di essi.
  3. Copia il risultato in un file .ts; importa ObjectId dal pacchetto mongodb.

Schema GraphQL con direttive 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
}

Tipi 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
}

Dettagli e limiti

@id diventa _id: ObjectId, @link diventa _id dell'entità collegata (Array<PostDbObject["_id"]> per elenchi) e @map(percorso: "login.email") crea un oggetto login nidificato.

I campi senza direttiva (nessuna @column, @id, @link, @embedded) non sono inclusi nel tipo DbObject; le colonne nullable diventano proprietà Maybe<T> opzionali.

L'output contiene anche i tipi standard di plugin dattiloscritto (eliminati sopra). La generazione viene eseguita in un Web Worker nel tuo browser.

FAQ

Devo dichiarare le direttive @entity e @column nel mio schema?

No. Il plugin aggiunge le proprie definizioni di direttiva, motivo per cui nell'output appare anche il tipo di input AdditionalEntityFields.

Come vengono digitati i documenti incorporati?

Un tipo dichiarato con @entity(embedded: true) ottiene un tipo DbObject senza _id e un campo contrassegnato con @embedded fa riferimento ad esso, ad esempio profile: ProfileDbObject.

Perché manca un campo nel tipo DbObject?

Solo i campi con @id, @column, @link, @embedded o @map sono campi memorizzati. Aggiungi @colonna per includere un campo semplice.

Specifiche e riferimenti