Los paquetes universales de Effectify proporcionan funcionalidad compartida, tipos y lógica de dominio que funcionan en React, SolidJS y Node.js. Encarnan los principios de Effect y habilitan comportamiento consistente en todo tu stack.
@effectify/chat-domain
Lógica de dominio y reglas de negocio para chat. Operaciones puras y agnósticas al framework construidas con Effect.
Más información →
@effectify/shared-types
Tipos e interfaces comunes de TypeScript compartidos por todos los paquetes. Asegura consistencia de tipos en tu aplicación.
Más información →
Inicio rápido
Aprende los conceptos y patrones usados en todos los paquetes de Effectify.
Empezar →
import { ChatDomain } from '@effectify/chat-domain'
import { Effect } from 'effect'
const sendMessage = ( roomId : string , content : string , userId : string ) =>
Effect. gen ( function* () {
const message = yield* ChatDomain. createMessage ({ roomId, content, userId, timestamp : new Date () })
const validation = yield* ChatDomain. validateMessage (message)
return validation
})
Componible
Seguro por tipos
Testeable
Confiable
interface User {
readonly id : UserId
readonly email : Email
readonly name : UserName
readonly createdAt : Date
}
const UserDomain = {
create : ( data : CreateUserData ) => Effect < User, ValidationError>,
validate : ( user : User ) => Effect < User, ValidationError>,
updateProfile : ( user : User , updates : UserUpdates ) => Effect < User, ValidationError>
}
class UserCreatedEvent {
readonly _tag = 'UserCreatedEvent'
constructor ( readonly user : User , readonly timestamp : Date ) {}
}
┌─────────────────────────────────────┐
│ Capa de Presentación │
│ (React, SolidJS, Express) │
├─────────────────────────────────────┤
│ Capa de Aplicación │
│ (Casos de uso, Servicios) │
├─────────────────────────────────────┤
│ Capa de Dominio │
│ (Paquetes Universales) │
├─────────────────────────────────────┤
│ Capa de Infraestructura │
│ (DB, APIs externas) │
└─────────────────────────────────────┘
export interface MessageRepository {
readonly save : ( message : Message ) => Effect < Message , RepositoryError >
readonly findById : ( id : MessageId ) => Effect < Message | null , RepositoryError >
readonly findByRoom : ( roomId : RoomId ) => Effect < Message [], RepositoryError >
}
export type UserId = string & { readonly _brand : 'UserId' }
export type RoomId = string & { readonly _brand : 'RoomId' }
export type MessageId = string & { readonly _brand : 'MessageId' }