Skip to content

Damba

Un framework Express pensé pour l'IA, piloté par les schémas. Vous déclarez vos entités TypeORM et une carte de services une seule fois ; Damba câble les routes REST, la validation, l'authentification, les docs, les files BullMQ et Socket.io autour d'elles. Ses conventions plates et greppables — sans magie DSL — rendent chaque service facile à lire, générer et relire pour les humains comme pour les agents de code IA.

Schémas / Entités  →  Services  →  Routes  →  Docs

Ce que vous obtenez

  • Pensé pour l'IA — une forme prévisible schéma → service → route → docs et des conventions plates et greppables (sans magie DSL) que les LLM et agents de code savent générer et relire de façon fiable.
  • CRUD auto-généré à partir de n'importe quelle entité TypeORM, avec des hooks before / after optionnels.
  • Comportements typés — fonctions factory avec un contexte de requête de première classe (api.DSave, api.env, api.enqueue, …).
  • Politiques — étapes d'autorisation composables avec des formes d'erreur JSON stables.
  • Temps réel — Socket.io encapsulé dans le même contexte tenant + corrélation que vos routes HTTP.
  • Files d'attente — producteurs + écouteurs BullMQ partageant le contexte ALS de la requête, avec sharding par tenant.
  • Erreurs — hiérarchie centrale DambaError produisant des réponses JSON standardisées.
  • Docs — pages API + Extras générées automatiquement.

Un aperçu en 30 secondes

ts
import { createDambaService, type BehaviorOf, type DambaApi } from "damba-v2";
import { z } from "zod";
import { User } from "./entities/User";

const CreateUserBody = z.object({
  name:  z.string().min(1),
  email: z.string().email(),
});

const createUser: BehaviorOf = (api?: DambaApi) => async (e) => {
  const body = e.in.body;  // validé + parsé par le schéma Zod
  const saved = await api!.DSave(body);
  return e.out.status(201).json(saved);
};

export default createDambaService({
  service: { name: "user", entity: User },
  behaviors: {
    "/users": {
      method: "POST",
      behavior: createUser,
      config: { validators: { body: CreateUserBody } },
    },
  },
});

C'est tout le pattern. La clé de route est le chemin ("/users") et le verbe est porté par le champ method, les behaviors sont des factories typées, et api expose un repository typé, des helpers d'environnement, des producteurs de files d'attente, et plus encore.

Pour aller plus loin

Liens du projet

Released under the MIT License.