elyumjs
v1.0.7
Published
Framework Node.js moderno com suporte a injeção de dependência e roteamento automático
Maintainers
Readme
🚀 ElyumJS — Um Microframework Web com TypeScript, Decorators e Injeção de Dependência
ElyumJS é um microframework backend criado do zero com TypeScript, focado em simplicidade, modularidade, injeção de dependência e validação robusta com Zod.
Inspirado em arquiteturas modernas como NestJS, oferece uma estrutura altamente extensível, leve e orientada a decorators — perfeita para APIs modulares e escaláveis.
✨ Funcionalidades
- ✅ Roteamento automático com decorators:
@Controller,@Get,@Post, etc. - ✅ Injeção de dependência automática baseada em metadata
- ✅ Validação automática com Zod nos parâmetros da requisição
- ✅ Criação de decorators customizados com
Reflector.createDecorator - ✅ Escopo de dependência entre módulos, com
importseexports - ✅ Suporte a inversão de dependência com
provide/useClass+@Inject - ✅ Sistema de ciclo de vida com
onModuleInit - ✅ Guards em múltiplos níveis: global, módulo, controller e handler
- ✅ Modularidade com escopo global via
@GlobalModuleou@Global
📦 Estrutura
elyumjs/
├── src/ # Núcleo do framework (a ser publicado como pacote)
│ ├── core/ # Decorators, contexto, ciclo de vida
│ ├── common/ # Tipos, interfaces, contratos
│ ├── errors/ # Erros e códigos HTTP customizados
│ ├── servers/express/ # Adaptadores para servidores (Express)
│ └── tests/ # Testes unitários e de integração
🧪 Exemplo de uso
Módulo com provider e inversão de dependência
@Module({
controllers: [AccountsController],
providers: [{ provide: 'IAccountsService', useClass: AccountsService }],
exports: [{ provide: 'IAccountsService', useClass: AccountsService }],
})
export class AccountsModule {}Módulo consumidor (escopo isolado com imports)
@Module({
imports: [AccountsModule],
controllers: [LeadsController],
providers: [LeadsService],
})
export class LeadsModule {}Controller com injeção e decorators HTTP
@Controller('accounts')
@RequiredRoles(['USERS'])
export class AccountsController {
constructor(
@Inject('IAccountsService')
private readonly accountsService: IAccountsService,
) {}
@Post()
@RequiredRoles(['ADMIN'])
async createAccount(
@Body(createAccountSchema) dto: CreateAccountDto,
): Promise<Response<Account>> {
const body = await this.accountsService.create(dto);
return { code: 201, body };
}
}📌 Guards (Auth, Role-based, etc)
- Aplicação automática com escopo:
- ✅ Global →
@GlobalModule({ guards: [...] }) - ✅ Módulo →
@Module({ guards: [...] }) - ✅ Controller →
@UseGuard(...) - ✅ Handler →
@UseGuard(...)
- ✅ Global →
export class RolesGuard implements IGuard {
canActivate(context: ExecutionContext): boolean {
const user = context.getUser();
return user?.roles?.includes('ADMIN');
}
}🔍 Request Binding e Validação
Você pode:
- ✅ Aplicar schemas com Zod em
@Body,@Query,@Param, etc. - ✅ Receber tipagens automáticas e parse embutido
- ✅ Definir parâmetros individuais ou objetos inteiros
@Put(':accountId')
update(
@Body(updateAccountSchema) dto: UpdateAccountDto,
@Param('accountId') id: string,
@Headers() headers: any,
) {
return this.accountsService.update(id, dto);
}Ou de forma validada:
@Delete(':accountId')
async delete(
@Param('accountId', z.string().uuid()) id: string,
) {
await this.accountsService.delete(id);
return { code: 204 };
}⚙️ Requisitos
- Node.js
v20+ - TypeScript
5.x "reflect-metadata"ativado
// tsconfig.json
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}import 'reflect-metadata';🚀 Executando localmente
pnpm install
pnpm start:dev # Inicia a aplicação de exemplo (src/)🧪 Testes
pnpm testTestes cobrem o container DI, rota e comportamento com mocks.
💡 Roadmap (To-do)
- [x] Ciclo de vida com
onModuleInit - [x] Inversão de dependência com
provide/useClass - [x] Guards multinível
- [x] Binding e validação automática
- [ ] CLI de scaffolding e geração
✍️ Autor
Daniel Rodrigues Desenvolvedor Full Stack | Estudante de Engenharia de Software 📍 Fortaleza - CE | Typescript, Node, React 💡 Apaixonado por backend moderno e arquitetura limpa
⭐ Curtiu o projeto?
Se esse framework te ajudou ou te inspirou, deixe uma ⭐ no repositório!
