Fiz uma alternativa ao Prisma e ao Mongoose para TypeScript

Há 5 meses eu escrevi um post aqui no TabNews contando como foi o processo de desenvolver uma framework TypeScript ao longo de 3 anos (muito obrigado por todas as stars que você deram nos repos!!!). Bom, acho que é hora de publicar atualizações e retificar algumas coisas do post original. Peço desculpas antecipadas se em algum momento eu parecer arrogante ou exagarar nas buzzwords.

Aeria

Por quê diabos escrever uma linguagem/framework para JavaScript?

Pra começar, o Aeria é um framework focado em MongoDB. Não é possível utilizá-lo com outro banco de dados. E as frameworks atuais compatíveis com MongoDB são subótimas de algumas formas:

  • O Mongoose não possui um bom suporte para TypeScript
  • O Prisma não suporta denormalização, fazendo uma espécie de emulação de um banco de dados relacional quando usado com o MongoDB
  • O Mongoose possui um sistema de hooks para lidar com referências, para fazer coisas como popular documentos, remoção em cascata, etc, ao invés de utilizar a Aggregation Framework

Usamos a Aggregation Framework do MongoDB, que permite resolver referências usando uma única transação (enquanto o Mongoose ou o Prisma usam uma transação para cada referência), eliminando um grande custo na rede e no processo do servidor web. Esse payload ainda é meio grande e há bastante espaço para optimizações, mas essa é uma decisão acertada que vai garantir que a framework seja mais rápida que as demais no longo prazo (embreve publicaremos benchmarks).

Além disso, a linguagem Aeria permite modelar dados usando um único arquivo .aeria (assim como o Prisma) porém com suporte a denormalização e referências nativas, dentre outras coisas (validações, rate limiting, definição automática de endpoints de CRUD, etc). O sentimento de estar descrevendo uma estrutura JSON é bem mais intuitivo do que declarar estruturas planas relacionadas por um ID como no Prisma.

Outro ponto importante é que ambicionamos criar uma linguagem/framework com definições nativas de AppSec. Seria incrível se desse para modelar dados, definir controle de acesso de forma explícita, rate limiting, etc, tudo dentro de um arquivo inteligível até mesmo por um Product Owner ou um Project Manager. Embora ainda há muito o que se melhorar, isso foi logrado com grande êxito no Aeria.

Características do código

  • <10k linhas de código TypeScript (o Mongoose possui 33k)
  • Um compilador feito em PureScript que emite .js e .d.ts
  • Plugins para editores de texto e IDEs, language servers, etc (atualmente suporta IDEs compatíveis com VSCode, Vim, e NeoVim)

O futuro

Esperamos que no futuro o Aeria se torne um projeto Open Source sustentável. Estamos trabalhando num modelo de negócio que será apresentado a investidores para garantir o financiamento do projeto para que todos possam usufruir dele (não custa nada sonhar). No momento o projeto roda com dinheiro pre-seed (do meu bolso) que vai para pagar outros programadores envolvidos no projeto.

Show me the code!

Esse é um exemplo de um sistema (usado em produção por uma empresa) feito usando o Aeria. Ele foi iniciado (com alguma ajuda) por um programador com pouquíssima experiência em JavaScript, quanto menos de TypeScript, mas o resultado foi um sistema enxuto, estritamente tipado, entregue em cerca de 15 dias. Esse é o benefício de reduzir o volume do código: o capital de tempo e de dinheiro gasto pela empresa também é reduzido dramaticamente. Link: https://github.com/capsulbrasil/tickets-system

Link dos repositórios do Aeria no Github (ficaremos muitíssimo gratos se vocês puderem deixar stars):

Muuuito obrigado pela leitura, e uma semana cheia de produtividade e paz para todos. Sintam-se à vontade para deixar comentários ou entrar em contato comigo de qualquer maneira.