Skip to content

Opciones ​

Todo lo que aceptan InverseModelModule.forRoot() y forRootAsync().

ts
InverseModelModule.forRoot({
  url: process.env.DATABASE_URL!,
  ssl: true,
  cache: { url: process.env.REDIS_URL!, ttl: 60 },
  pagination: { defaultLimit: 100, maxLimit: 1000 },
  include: ['authors', 'blog_posts'],
  readOnly: ['audit_*'],
  graphql: { introspection: true },
});

Conexión ​

OpciónPor defectoQué hace
url(obligatoria)Cadena de conexión; su protocolo elige la base de datos. Consulta Bases de datos.
sslel del drivertrue, o { rejectUnauthorized, ca, cert, key } con contenido PEM. Consulta TLS.

Forma de la API ​

OpciónPor defectoQué hace
pagination.defaultLimit100Filas que devuelve una lista sin limit.
pagination.maxLimit1000El limit más grande aceptado, y el máximo de filas que escriben createMany y deleteMany.
naming.typePascalCase en singular(table) => string: nombre del tipo de una tabla, dado su nombre tal como aparece listado (calificado con el schema donde la base de datos tiene schemas). Consulta Nombres.
naming.fieldcamelCase(column, table) => string: nombre del campo de una columna.
naming.pluralplural en inglés(type) => string: plural de un nombre de tipo, para listas, conteos y relaciones a muchos.
rename.tables{}Nombre de tipo por tabla, por ejemplo { blog_posts: 'Article' }. Consulta Renombrar.
rename.fields{}Nombre de campo por table.column, por ejemplo { 'authors.full_name': 'name' }.
views{}Por nombre de vista, primaryKey (columnas) y foreignKeys ({ columns, table, references }). Consulta Vistas.

Seguridad ​

Consulta Seguridad.

OpciónPor defectoQué hace
includetodoTablas y campos table.column a exponer; * coincide con cualquier nombre.
excludenadaTablas y campos a ocultar; tiene prioridad sobre include.
readOnlyfalsetrue, o las tablas que no tienen mutations.
queryLimits.maxDepth10El anidamiento de campos más profundo que puede tener una query.
queryLimits.maxComplexity50000El costo estimado más alto de una query.
authorizepermitir todo({ model, type, operation, context, args }) => boolean | Promise<boolean>.
scopeninguno({ model, type, operation, context }) => Where | null, combinado con AND en lecturas, updates y deletes.

Cache ​

Consulta Cache.

OpciónPor defectoQué hace
cache.url(sin cache)Cadena de conexión de Redis. Necesita ioredis.
cache.ttl60Segundos que se conserva un resultado.
cache.ttlByTable{}TTL por tabla; 0 deja una tabla sin cache.
cache.keyPrefixinverse:Prefijo de cada clave de Redis.

Extender ​

Consulta Extender la API.

OpciónPor defectoQué hace
hooksningunoPor tabla, o *: beforeCreate, afterCreate, beforeUpdate, afterUpdate, beforeDelete, afterDelete.
extend.typeDefsningunoSDL que se combina con el schema generado.
extend.resolversningunoResolvers, o una función de { connection, model, writes } que los devuelve.

Apollo ​

OpciónPor defectoQué hace
graphql{}Cualquier opción de ApolloDriverConfig excepto driver, typeDefs y resolvers, que vienen de la base de datos: path, context, introspection, plugins, formatError…

forRootAsync ​

Toma las opciones de una factory, así que pueden venir de @nestjs/config o de cualquier otro provider:

ts
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
    InverseModelModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        url: config.getOrThrow('DATABASE_URL'),
        cache: config.get('REDIS_URL') ? { url: config.get('REDIS_URL') } : undefined,
      }),
    }),
  ],
})
export class AppModule {}

useClass y useExisting también funcionan, con una clase cuyo createInverseModelOptions() devuelva las opciones. Las opciones se pueden inyectar mediante el token INVERSE_MODEL_OPTIONS.

Publicado bajo la licencia MIT.