Ir al contenido principal
SaaSFormation
Docs
ES
OO · DDD · CQRS · Event Sourcing

El framework TypeScript para
SaaS empresarial

Orientado a objetos y domain-driven por diseño. Construido para equipos que desarrollan SaaS complejos y multi-tenant sobre microservicios — no solo landing pages.

$ sf init
 Monorepo created

$ sf generate microservice crm
 crm microservice created

$ sf run
 crm microservice started  → http://localhost:3000/
 admin panel companion started  → http://localhost:3001/

Construido para la complejidad real

La mayoría de frameworks se limitan al routing y la autenticación. SaaSFormation va más lejos.

Event Sourcing de primera clase

Aggregates, eventos de dominio y proyecciones con replay integrado. El log de eventos es la fuente de verdad.

Comunicación entre servicios con tipos seguros

Contratos TypeScript compartidos entre fronteras de servicio. Sin sorpresas en runtime cuando los servicios se comunican.

Message Bus unificado

Peticiones HTTP, comandos, queries y eventos de dominio siguen el mismo patrón de message bus. Cada bus acepta middleware: añade logging, autenticación o trazado una vez y se aplica en todas partes.

DDD + DI incluidos

Contenedor de inyección de dependencias con reflect-metadata e inyección por constructor. Repositorios, servicios y handlers se autocablean.

Observabilidad lista para producción

Trazas OpenTelemetry y dashboards de Grafana preconfigurados. Sabe exactamente qué hacen tus servicios en producción.

HTTP + JSON:API

JSON:API conforme al estándar con documentación Swagger integrada. Endpoints versionados y consistentes que tus consumidores pueden explorar y probar desde el primer día.

Como deben verse los handlers

Sin espagueti. Command handlers limpios, con tipos y testeables, con las dependencias que necesitan — y nada más.

  • Constructor injection via @Inject — no service locators
  • Domain events dispatched automatically by the repository on save
  • Fully typed — CommandHandler<T> enforces the contract
import { Inject } from "@saasformation/di";
import { CommandHandler } from "@saasformation/message-bus";

@CommandHandler(RegisterUser)
export class RegisterUserHandler
  implements CommandHandler<RegisterUser>
{
  constructor(
    @Inject(UserRepository)
    private readonly users: UserRepository,
  ) {}

  async handle(cmd: RegisterUser): Promise<void> {
    const user = User.register(
      cmd.email,
      await Password.hash(cmd.password),
    );
    await this.users.save(user);
  }
}

Sé el primero en publicar con SaaSFormation

Abrimos el acceso de forma progresiva. Deja tu email y te avisaremos cuando sea tu turno.

Sin spam. Tu email solo se usa para notificarte cuando el acceso esté disponible.