🌻A modular DI, MVC, and Model binding/validation framework for NodeJS and TypeScript or ES6

View the Project on GitHub just-dandi/dandi


The @dandi/data package provides basic types and helpers for data clients that connect databases and other data providers to your Dandi application. These types provide a standard interface for working with external data within Dandi.


The interfaces defined in @dandi/data are intended to allow wrapping existing database client implementations (e.g. node-postgres) and extending their functionality with Dandi.


Use a @dandi/config configuration provider to supply connection and authentication information to the @dandi/data client. This example uses AwsSsmConfigClient and the @dandi-contrib/data-pg client.

import { AwsSsmConfigClient } from '@dandi-contrib/config-aws-ssm'
import { DandiApplication } from '@dandi/core'
import { PgDbModule } from '@dandi-contrib/data-pg'

const myApp = new DandiApplication({
  providers: [


    // database




API Reference

This reference describes the generic interfaces defined by @dandi/data. Each implementation may vary, but this documentation describes the intention of the interfaces.


A model for describing connection info for a database connection. Used with @dandi/config to allow retrieving from a configuration provider like AWS SSM (see @dandi-contrib/config-aws-ssm.


A model for describing user credentials for authenticating with a database. Used with @dandi/config to allow retrieving from a configuration provider like AWS SSM (see @dandi-contrib/config-aws-ssm.


The most basic client interface for working with a database.


Extends DbQueryable to allow using transactions.


An extension of DbQueryable that is used during a transaction. Also extends Disposable. The transaction is automatically committed during dispose() unless an exception is thrown, in which case it is automatically rolled back.

Transaction Example

export class MyModelManager {
  constructor(@Inject(DbClient) private dbClient: DbClient) {}

  public addModel(model: MyModelRequest): Promise<MyModel> {
    return this.dbClient.transaction(async (tran) => {
      const query1 = await tran.queryModelSingle(MyModel, INSERT_QUERY, model.name)
      const query2 = await tran.query(INSERT_MODEL_PERMISSION)
      return query1